Skip to content
Snippets Groups Projects
rtree.py 1.17 KiB
Newer Older
  • Learn to ignore specific revisions
  • 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]))