sclass BreadthFirstPathFinder implements Steppable { new LinkedList queue; MultiMap links; IF1> getChildren; // must set *() {} *(IF1> *getChildren) {} *(IF1> *getChildren, A startNode) { add(startNode); } void add(A a, A prev default null) { if (!links.containsKey(a)) { links.put(a, prev); queue.add(a); } } public bool step() { if (empty(queue)) false; A a = popFirst(queue); fOr (A b : getChildren.get(a)) add(b, a); true; } bool nodeReached(A a) { ret links.containsKey(a); } Cl getBackLinks(A a) { ret links.get(a); } }