aboutsummaryrefslogtreecommitdiff
path: root/functional_tools
diff options
context:
space:
mode:
authorFrederick Muriuki Muriithi2024-01-15 17:49:14 +0300
committerFrederick Muriuki Muriithi2024-01-15 17:49:14 +0300
commit42b43f8d46fe0c25703de914a687127726ece35e (patch)
treef30490a689be720969a1a57cd3bd92e9abf68739 /functional_tools
parentef6da7313f96390b9fecb126f9b7e9beb1afe034 (diff)
downloadgn-uploader-42b43f8d46fe0c25703de914a687127726ece35e.tar.gz
Extract common functional tools to separate package.
Diffstat (limited to 'functional_tools')
-rw-r--r--functional_tools/__init__.py33
1 files changed, 33 insertions, 0 deletions
diff --git a/functional_tools/__init__.py b/functional_tools/__init__.py
new file mode 100644
index 0000000..057bd9a
--- /dev/null
+++ b/functional_tools/__init__.py
@@ -0,0 +1,33 @@
+"""Tools to help with a more functional way of doing things."""
+from typing import Iterable
+from functools import reduce
+
+def take(iterable: Iterable, num: int) -> list:
+ """Take at most `num` items from `iterable`."""
+ iterator = iter(iterable)
+ items = []
+ try:
+ for i in range(0, num): # pylint: disable=[unused-variable]
+ items.append(next(iterator))
+
+ return items
+ except StopIteration:
+ return items
+
+def chain(value, *functions):
+ """
+ Flatten nested expressions
+
+ Inspired by, and approximates, Clojure's `->`.
+
+ Useful to rewrite nested expressions like func3(a, b, func2(c, func1(d e)))
+ into arguably flatter expressions like:
+ chain(
+ d,
+ partial(func1, e=val1),
+ partial(func2, c=val2),
+ partial(func3, a=val3, b=val3))
+
+ This can probably be improved.
+ """
+ return reduce(lambda result, func: func(result), functions, value)