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() {
ping();
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);
}
}