| "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 |
| |
| def unique(arr): |
| """Return a new list with unique items in it. |
| |
| Example: |
| `unique(["foo", "bar", "foo", "baz"]) // ["foo", "bar", "baz"]` |
| |
| Args: |
| arr: List to iterate over |
| |
| Returns: |
| A new list with unique items |
| """ |
| res = [] |
| for a in arr: |
| if a not in res: |
| res.append(a) |
| return res |