Add filtering on branches mid-iteration.

This commit is contained in:
Tom Alexander
2026-06-27 18:20:38 -04:00
parent 4ea47a3459
commit 55c2785c0e

View File

@@ -25,6 +25,7 @@ def main():
activity_tree,
lambda act: act.id in (2, 5, 10),
lambda act: act.id in (4,),
lambda act: act.id in (1, 2, 3, 4, 5, 6, 7, 8, 9, 10),
)
while (depth_and_node := match_iter.get_next()) is not None:
@@ -61,17 +62,20 @@ class MatchIter:
stack: deque[StackEntry]
is_match: Callable[[Activity], bool]
is_transparent: Callable[[Activity], bool]
is_alive: Callable[[Activity], bool]
def __init__(
self,
activity_tree: ActivityTree,
is_match: Callable[[Activity], bool],
is_transparent: Callable[[Activity], bool],
is_alive: Callable[[Activity], bool],
) -> None:
self.activity_tree = activity_tree
self.stack = deque([StackEntry(0)])
self.is_match = is_match
self.is_transparent = is_transparent
self.is_alive = is_alive
def get_next(self) -> tuple[int, bool, bool, Activity] | None:
if (next_announce := self.get_next_announce()) is not None:
@@ -104,7 +108,9 @@ class MatchIter:
stack_entry.transparent = self.is_transparent(node)
children = [
c for c in self.activity_tree.activities.values() if c.parent == node.id
c
for c in self.activity_tree.activities.values()
if c.parent == node.id and self.is_alive(c)
]
# for c in children:
for c in reversed(children):