From 1232af793bd4dc1ab86f9a6ebdf33a21d94c9064 Mon Sep 17 00:00:00 2001 From: Christian Gram Kalhauge <chrg@dtu.dk> Date: Fri, 23 Feb 2024 09:32:54 +0100 Subject: [PATCH] Add simply python library as well --- pyrtree/.gitignore | 1 + pyrtree/rtree.py | 63 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+) create mode 100644 pyrtree/.gitignore create mode 100644 pyrtree/rtree.py diff --git a/pyrtree/.gitignore b/pyrtree/.gitignore new file mode 100644 index 0000000..bee8a64 --- /dev/null +++ b/pyrtree/.gitignore @@ -0,0 +1 @@ +__pycache__ diff --git a/pyrtree/rtree.py b/pyrtree/rtree.py new file mode 100644 index 0000000..bec022b --- /dev/null +++ b/pyrtree/rtree.py @@ -0,0 +1,63 @@ +from dataclasses import dataclass + + +@dataclass +class ReducePath: + path: list[bool] + index: int = 0 + + def explore(self, choice): + self.index = 0 + self.path.append(choice) + return self + + def didGuess(self): + return self.index > len(self.path) + + def dispensable(self): + self.index += 1 + try: + return self.path[self.index - 1] + except IndexError: + return False + + +def reduce(predicate, rtree): + r = ReducePath([]) + i = rtree(r) + + if not predicate(i): + return None + + while r.didGuess(): + # Explore the left tree + i = rtree(r.explore(True)) + # If the predcate fails, move right + r.path[-1] = predicate(i) + + return i + + +def debug(predicate): + def newpred(i): + t = predicate(i) + print(t, i) + return t + + return newpred + + +def reduce_list(items: list): + def rtree(r: ReducePath) -> list: + results = [] + for i in items: + if r.dispensable(): + continue + results.append(i) + return results + + return rtree + + +if __name__ == "__main__": + reduce(debug(lambda a: 1 in a), reduce_list([1, 2, 3])) -- GitLab