// TODO: clean up these type signatures? static > ItIt nestedIterator(Iterable c, final F1 makeInnerIterator) { ret nestedIterator(iterator(c), makeInnerIterator); } static > ItIt nestedIterator(Iterable c, IF1 makeInnerIterator) { ret nestedIterator(iterator(c), makeInnerIterator); } static > ItIt nestedIterator(ItIt c, IF1 makeInnerIterator) { ret nestedIterator((Iterator) c, makeInnerIterator); } static > ItIt nestedIterator(Iterator it1, IF1 makeInnerIterator) { if (it1 == null || !it1.hasNext()) ret emptyItIt(); ret iff(new F0 { A a; Iterator innerIterator; { nextOuter(); } void nextOuter { a = it1.next(); innerIterator = makeInnerIterator.get(a); } public O get() { while true { ping(); if (innerIterator != null && innerIterator.hasNext()) ret innerIterator.next(); if (!it1.hasNext()) ret endMarker(); nextOuter(); } } }); } static > ItIt nestedIterator(final Iterator it1, F1 makeInnerIterator) { if (it1 == null || !it1.hasNext()) ret emptyItIt(); ret iff(new F0 { A a; Iterator innerIterator; { nextOuter(); } void nextOuter { a = it1.next(); innerIterator = makeInnerIterator.get(a); } public O get() { while true { ping(); if (innerIterator != null && 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); }