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