sclass AllOnAllWithUpdates { long aCounter, bCounter; new TreeMap aList; new TreeMap bList; LPair todo = new LinkedList; LPair todo2 = new LinkedList; synchronized void newA(A a) { long c = aCounter++; aList.put(c, a); addPair(todo, longRange_one(c), longRange(0, bCounter)); } synchronized void newB(B b) { long c = bCounter++; bList.put(c, b); addPair(todo, longRange(0, aCounter), longRange_one(c)); } synchronized void updateA(A a) { removeValue(aList, a); newA(a); } synchronized void updateB(B b) { removeValue(bList, b); newB(b); } synchronized Pair next() { while licensed { while (empty(todo2)) { if (empty(todo)) null; Pair p = popFirst(todo); addAll(todo2, outerProduct_pairs(keys(subMap_longRange(aList, p.a)), keys(subMap_longRange(bList, p.b)))); } Pair p = popFirst(todo2); A a = aList.get(p.a); B b = bList.get(p.b); if (a != null && b != null) ret pair(a, b); } null; } }