static > ItIt> outerProduct(L lists) { if (empty(lists)) ret singletonIterator(new L); L lists2 = dropFirst(lists); ret nestedIterator(first(lists), func(A a) -> Iterator> { mapI(outerProduct(lists2), l -> itemPlusList(a, l)) }); }