// f : A -> Collection
static ItIt mapLike repeatFunctionReturningList_iterator(O f, A input, O... _) {
final Set seen = optParOr seen(_, () -> (Set) new HashSet);
final Int max = cast optPar max(_);
bool plusInput = boolPar plusInput(_); // return original input too?
// Make pool of iterators
final new LinkedList> pool;
if (plusInput) pool.add(singletonIterator(input));
else seen.add(input);
pool.add(iterator((Iterable) callF(f, input)));
ret iteratorFromFunction(new F0 {
int n = 0;
public A get() {
if (max != null && n >= max) null;
while ping (!empty(pool)) {
Iterator it = first(pool);
if (!it.hasNext()) continue with removeFirst(pool);
// Get entry and check if seen already
A entry = it.next();
if (!seen.add(entry)) continue;
// found new entry - return and schedule for further analysis
Collection newStuff = cast callF(f, entry);
if (nempty(newStuff))
pool.add(iterator(newStuff));
++n;
ret entry;
}
null;
}
});
}