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