Skip to content

Commit 7911ff5

Browse files
mgredalexeagle
authored andcommitted
feat(list): add unique function (#716)
* feat(list): add `unique` function * Update lists.bzl * Update lists.bzl * Update lists.bzl * Update lists.bzl --------- Co-authored-by: Alex Eagle <alex@aspect.dev>
1 parent 044ff55 commit 7911ff5

File tree

4 files changed

+57
-2
lines changed

4 files changed

+57
-2
lines changed

docs/lists.md

+26
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lib/lists.bzl

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
"Functions for lists"
22

3-
load("//lib/private:lists.bzl", _every = "every", _filter = "filter", _find = "find", _map = "map", _once = "once", _pick = "pick", _some = "some")
3+
load("//lib/private:lists.bzl", _every = "every", _filter = "filter", _find = "find", _map = "map", _once = "once", _pick = "pick", _some = "some", _unique = "unique")
44

55
every = _every
66
filter = _filter
@@ -9,3 +9,4 @@ map = _map
99
once = _once
1010
pick = _pick
1111
some = _some
12+
unique = _unique

lib/private/lists.bzl

+18
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,21 @@ def some(f, arr):
117117
if f(a):
118118
return True
119119
return False
120+
121+
def unique(arr):
122+
"""Return a new list with unique items in it.
123+
124+
Example:
125+
`unique(["foo", "bar", "foo", "baz"]) // ["foo", "bar", "baz"]`
126+
127+
Args:
128+
arr: List to iterate over
129+
130+
Returns:
131+
A new list with unique items
132+
"""
133+
res = []
134+
for a in arr:
135+
if a not in res:
136+
res.append(a)
137+
return res

lib/tests/lists_test.bzl

+11-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
"""unit tests for lists"""
22

33
load("@bazel_skylib//lib:unittest.bzl", "asserts", "unittest")
4-
load("//lib/private:lists.bzl", "every", "filter", "find", "map", "once", "pick", "some")
4+
load("//lib/private:lists.bzl", "every", "filter", "find", "map", "once", "pick", "some", "unique")
55

66
def _every_test_impl(ctx):
77
env = unittest.begin(ctx)
@@ -70,6 +70,15 @@ def _some_test_impl(ctx):
7070

7171
some_test = unittest.make(_some_test_impl)
7272

73+
def _unique_test_impl(ctx):
74+
env = unittest.begin(ctx)
75+
76+
asserts.equals(env, unique(["foo", {"bar": "baz"}, 42, {"bar": "baz"}, "foo"]), ["foo", {"bar": "baz"}, 42])
77+
78+
return unittest.end(env)
79+
80+
unique_test = unittest.make(_unique_test_impl)
81+
7382
def lists_test_suite():
7483
unittest.suite(
7584
"lists_tests",
@@ -80,4 +89,5 @@ def lists_test_suite():
8089
once_test,
8190
pick_test,
8291
some_test,
92+
unique_test,
8393
)

0 commit comments

Comments
 (0)