in src/main/java/net/hydromatic/linq4j/EnumerableDefaults.java [1447:1485]
public static <TSource, TResult> Enumerable<TResult> selectMany(
final Enumerable<TSource> source,
final Function1<TSource, Enumerable<TResult>> selector) {
return new AbstractEnumerable<TResult>() {
public Enumerator<TResult> enumerator() {
return new Enumerator<TResult>() {
Enumerator<TSource> sourceEnumerator = source.enumerator();
Enumerator<TResult> resultEnumerator = Linq4j.emptyEnumerator();
public TResult current() {
return resultEnumerator.current();
}
public boolean moveNext() {
for (;;) {
if (resultEnumerator.moveNext()) {
return true;
}
if (!sourceEnumerator.moveNext()) {
return false;
}
resultEnumerator = selector.apply(sourceEnumerator.current())
.enumerator();
}
}
public void reset() {
sourceEnumerator.reset();
resultEnumerator = Linq4j.emptyEnumerator();
}
public void close() {
sourceEnumerator.close();
resultEnumerator.close();
}
};
}
};
}