sclass AllOnAll {
new L aList;
new L bList;
LPair todo = new LinkedList;
LPair todo2 = new LinkedList;
synchronized void newA(A a) {
add(aList, a);
addPair(todo, intRange_last(aList), intRange(0, l(bList)));
}
synchronized void newB(B b) {
add(bList, b);
addPair(todo, intRange(0, l(aList)), intRange_last(bList));
}
synchronized Pair next() {
while (empty(todo2)) {
if (empty(todo)) null;
Pair p = popFirst(todo);
addAll(todo2, outerProduct_pairs(subList(aList, p.a), subList(bList, p.b)));
}
ret popFirst(todo2);
}
}