"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