Newer
Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
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]))