package org.osgl.util;
import org.osgl.$;
import java.util.Iterator;
/**
* Created with IntelliJ IDEA.
* User: luog
* Date: 8/10/13
* Time: 8:06 PM
* To change this template use File | Settings | File Templates.
*/
class FlatMappedIterator<T, R> extends StatefulIterator<R> {
private final Iterator<? extends T> data;
private final $.Function<? super T, ? extends Iterable<? extends R>> mapper;
private Iterator<? extends R> curMapped = null;
FlatMappedIterator(Iterator<? extends T> itr, $.Function<? super T, ? extends Iterable<? extends R>> mapper) {
E.NPE(itr, mapper);
this.data = itr;
this.mapper = mapper;
}
protected Iterator<? extends T> data() {return data;}
protected $.Function<? super T, ? extends Iterable<? extends R>> mapper() {return mapper;}
@Override
protected $.Option<R> getCurrent() {
while (null == curMapped || !curMapped.hasNext()) {
if (!data.hasNext()) {
return $.none();
}
curMapped = mapper.apply(data.next()).iterator();
}
return $.some((R)curMapped.next());
}
}