// TODO: clean up these type signatures? static > ItIt nestedIterator(final Iterable c, final F1 makeInnerIterator) { ret nestedIterator(iterator(c), makeInnerIterator); } static > ItIt nestedIterator(Cl c, final IF1 makeInnerIterator) { ret nestedIterator(iterator(c), makeInnerIterator); } static > ItIt nestedIterator(Iterator it1, IF1 makeInnerIterator) { ret nestedIterator(it1, toF1(makeInnerIterator)); } static > ItIt nestedIterator(final Iterator it1, final F1 makeInnerIterator) { if (it1 == null || !it1.hasNext()) ret emptyIterableIterator(); ret iff(new F0 { A a; Iterator innerIterator; { nextOuter(); } void nextOuter { a = it1.next(); innerIterator = callF(makeInnerIterator, a); } public O get() { while true { ping(); if (innerIterator.hasNext()) ret innerIterator.next(); if (!it1.hasNext()) ret endMarker(); nextOuter(); } } }); } static > ItIt lambdaMapLike nestedIterator(IF1 makeInnerIterator, Iterator it1) { ret nestedIterator(it1, makeInnerIterator); } static > ItIt nestedIterator(IF1 makeInnerIterator, Cl l) { ret nestedIterator(l, makeInnerIterator); }