My understanding of push pull is that. We mark nodes in the graph as dirty (to be recalculated) with a push, then only calculate the values when they get observed by side effecting code (the users listener). Except for in nodes that require the value in order to know if the target nodes will become dirty (like in Stream.filter), they are evaluated eagerly. By maximising the number of values that only get calculated upon observation, we form the "pull" part of the push-pull.
I could be completely wrong. I found conals push-pull paper very confusing, I did not understand it fully.
However if my intuitions are correct, this code might deserve a review: