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); } }