| 35 | self.lookup: Dict[int, Tuple[T, CLVMStorage]] = dict() |
| 36 | |
| 37 | def get(self, obj: CLVMStorage) -> T: |
| 38 | obj_id = id(obj) |
| 39 | if obj_id not in self.lookup: |
| 40 | obj_list = [obj] |
| 41 | while obj_list: |
| 42 | node = obj_list.pop() |
| 43 | node_id = id(node) |
| 44 | if node_id not in self.lookup: |
| 45 | v = self.f(self, node) |
| 46 | if v is None: |
| 47 | if node.pair is None: |
| 48 | raise ValueError("f returned None for atom", node) |
| 49 | obj_list.append(node) |
| 50 | obj_list.append(node.pair[0]) |
| 51 | obj_list.append(node.pair[1]) |
| 52 | else: |
| 53 | self.lookup[node_id] = (v, node) |
| 54 | return self.lookup[obj_id][0] |
| 55 | |
| 56 | def contains(self, obj: CLVMStorage) -> bool: |
| 57 | return id(obj) in self.lookup |