package org.osgl.util; import org.osgl.$; import java.util.Iterator; /** * Created with IntelliJ IDEA. * User: luog * Date: 22/10/13 * Time: 10:32 PM * To change this template use File | Settings | File Templates. */ class FilteredIterator<T> extends StatefulIterator<T> { static enum Type { ALL, WHILE, UNTIL; <T> Iterator<T> filter(Iterator<T> raw, $.Function<? super T, Boolean> predicate) { return new FilteredIterator<T>(raw, predicate, this); } } private final Iterator<? extends T> itr_; private final $.Predicate<T> filter_; private final Type type_; private boolean start_; FilteredIterator(Iterator<? extends T> iterator, $.Function<? super T, Boolean> filter) { this(iterator, filter, Type.ALL); } FilteredIterator(Iterator<? extends T> iterator, $.Function<? super T, Boolean> filter, Type type) { E.NPE(iterator, filter); itr_ = iterator; filter_ = $.predicate(filter); type_ = type; } protected Iterator<? extends T> data() {return itr_;} @Override protected $.Option<T> getCurrent() { boolean ok; while (itr_.hasNext()) { T t = itr_.next(); switch (type_) { case ALL: ok = filter_.test(t); if (ok) { return $.some(t); } else { continue; } case WHILE: ok = filter_.test(t); if (ok) { return $.some(t); } else { return $.none(); } case UNTIL: if (start_) { return $.some(t); } ok = filter_.test(t); if (ok) { start_ = true; return $.some(t); } else { continue; } } } return $.none(); } }