// synchronized
sclass SeenAndQueue {
Set seen = syncSet();
L queue = syncLinkedList();
// L
transient L onAddedToQueue;
bool add(A a) {
if (!seen.add(a)) false;
queue.add(a);
pcallFAll(onAddedToQueue, a);
true;
}
A popQueue() { ret syncPopFirst(queue); }
}