sclass AllOnAll { new L aList; new L bList; LPair, L> todo = new LinkedList; LPair todo2 = new LinkedList; void newA(A a) { add(aList, a); addPair(todo, ll(a), cloneList(bList)); } void newB(B b) { add(bList, b); addPair(todo, cloneList(aList), ll(b)); } Pair next() { while (empty(todo2)) { if (empty(todo)) null; addAll(todo2, outerProduct_pairs(popFirst(todo))); } ret popFirst(todo2); } }