// synchronized
sclass SeenAndQueue {
Set seen = syncSet();
L queue = syncLinkedList();
// L
transient L onAddedToQueue = syncList();
transient L onQueueEmpty = syncList();
bool add(A a) {
if (!seen.add(a)) false;
queue.add(a);
pcallFAll(onAddedToQueue, a);
true;
}
A popQueue() {
ping();
synchronized(queue) {
A a = syncPopFirst(queue);
if (a != null && empty(queue))
pcallFAll(onQueueEmpty);
ret a;
}
}
void onAddedToQueue(O r) { onAddedToQueue.add(r); }
}