static > ItIt> outerProduct_faster(L lists) { ret mapI fromSimplyLinkedList(outerProduct_faster(toSimplyLinkedList(lists))); } static > ItIt> outerProduct_faster(SimplyLinkedList lists) { if (lists == null) ret singletonIterator(null); SimplyLinkedList lists2 = lists.tail; ret nestedIterator(lists.head, func(A a) -> Iterator> { mapI(outerProduct_faster(lists2), l -> SimplyLinkedList.cons(a, l)) }); }