FlatMappingIterable.java
package no.motif.iter;
import java.io.Serializable;
import java.util.Iterator;
import no.motif.f.Fn;
class FlatMappingIterable<I, O> implements Iterable<O>, Serializable {
private final Iterable<I> elements;
private final Fn<? super I, ? extends Iterable<O>> fn;
public FlatMappingIterable(Iterable<I> elements, Fn<? super I, ? extends Iterable<O>> fn) {
this.elements = elements;
this.fn = fn;
}
@Override
public Iterator<O> iterator() {
return new FlatMappingIterator();
}
private final class FlatMappingIterator extends ReadOnlyIterator<O> {
Iterator<I> iterator = elements.iterator();
Iterator<O> mapped = EmptyIterator.<O>instance();
@Override
public boolean hasNext() {
if (!mapped.hasNext() && iterator.hasNext()) {
mapped = fn.$(iterator.next()).iterator();
}
return mapped.hasNext();
}
@Override
public O next() {
return mapped.next();
}
}
}