mirror of
https://github.com/bazel-contrib/bazel-lib
synced 2024-11-28 21:33:48 +00:00
45986f000d
* feat: add list utils * chore: add docs for lists * fixes accoding to review --------- Co-authored-by: Alex Eagle <alex@aspect.dev>
120 lines
2.7 KiB
Python
120 lines
2.7 KiB
Python
"Function definitions for working with lists"
|
|
|
|
def every(f, arr):
|
|
"""Check if every item of `arr` passes function `f`.
|
|
|
|
Example:
|
|
`every(lambda i: i.endswith(".js"), ["app.js", "lib.js"]) // True`
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
True or False
|
|
"""
|
|
return len(filter(f, arr)) == len(arr)
|
|
|
|
def filter(f, arr):
|
|
"""Filter a list `arr` by applying a function `f` to each item.
|
|
|
|
Example:
|
|
`filter(lambda i: i.endswith(".js"), ["app.ts", "app.js", "lib.ts", "lib.js"]) // ["app.js", "lib.js"]`
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
A new list containing items that passed the filter function.
|
|
"""
|
|
res = []
|
|
for a in arr:
|
|
if f(a):
|
|
res.append(a)
|
|
return res
|
|
|
|
def find(f, arr):
|
|
"""Find a particular item from list `arr` by a given function `f`.
|
|
|
|
Unlike `pick`, the `find` method returns a tuple of the index and the value of first item passing by `f`.
|
|
Furhermore `find` does not fail if no item passes `f`.
|
|
In this case `(-1, None)` is returned.
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
Tuple (index, item)
|
|
"""
|
|
i = 0
|
|
for a in arr:
|
|
if f(a):
|
|
return (i, a)
|
|
i += 1
|
|
return (-1, None)
|
|
|
|
def map(f, arr):
|
|
"""Apply a function `f` with each item of `arr` and return a new list.
|
|
|
|
Example:
|
|
`map(lambda i: i*2, [1, 2, 3]) // [2, 4, 6]`
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
A new list with all mapped items.
|
|
"""
|
|
return [f(a) for a in arr]
|
|
|
|
def once(f, arr):
|
|
"""Check if exactly one item in list `arr` passes the given function `f`.
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
True or False
|
|
"""
|
|
return len(filter(f, arr)) == 1
|
|
|
|
def pick(f, arr):
|
|
"""Pick a particular item in list `arr` by a given function `f`.
|
|
|
|
Unlike `filter`, the `pick` method returns the first item _found_ by `f`.
|
|
If no item has passed `f`, the function will _fail_.
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
item
|
|
"""
|
|
for a in arr:
|
|
if f(a):
|
|
return a
|
|
fail("Could not find any item")
|
|
|
|
def some(f, arr):
|
|
"""Check if at least one item of `arr` passes function `f`.
|
|
|
|
Example:
|
|
`some(lambda i: i.endswith(".js"), ["app.js", "lib.ts"]) // True`
|
|
|
|
Args:
|
|
f: Function to execute on every item
|
|
arr: List to iterate over
|
|
|
|
Returns:
|
|
True or False
|
|
"""
|
|
for a in arr:
|
|
if f(a):
|
|
return True
|
|
return False
|