sclass SeenAndQueue {
Set seen = syncSet();
L queue = syncLinkedList();
// Runnable or voidfunc(A)
transient O onAddedToQueue;
bool add(A a) {
if (!seen.add(a)) false;
queue.add(a);
pcallF(onAddedToQueue, a);
}
A popQueue() { ret syncPopFirst(queue); }
}