package org.osgl.util; import org.osgl.$; import java.util.EnumSet; import java.util.Enumeration; import java.util.Iterator; /** * Adapt an {@link java.util.Iterator} to a {@link C.Sequence} */ class IteratorSeq<T> extends SequenceBase<T> { private final Iterator<? extends T> itr_; IteratorSeq(final Iterator<? extends T> itr) { E.NPE(itr); itr_ = itr; } @Override protected EnumSet<C.Feature> initFeatures() { return EnumSet.of(C.Feature.READONLY); } @Override public Iterator<T> iterator() { return new DelegatingIterator<T>(itr_, true); } @Override public C.Sequence<T> head(int n) { if (n < 0) { throw new UnsupportedOperationException(); } if (n == 0) { return Nil.seq(); } return of(Iterators.filterIndex(itr_, N.F.lt(n))); } @Override public C.Sequence<T> tail() throws UnsupportedOperationException { if (isEmpty()) { throw new UnsupportedOperationException(); } return of(Iterators.filterIndex(itr_, N.F.gt(0))); } @Override public C.Sequence<T> takeWhile($.Function<? super T, Boolean> predicate) { return of(Iterators.filterWhile(itr_, predicate)); } @Override public C.Sequence<T> drop(int n) { return of(Iterators.filterIndex(itr_, N.F.gte(n))); } @Override public C.Sequence<T> dropWhile($.Function<? super T, Boolean> predicate) { return of(Iterators.filterUntil(itr_, $.F.negate(predicate))); } @Override public C.Sequence<T> append(C.Sequence<? extends T> seq) { return of(Iterators.composite(itr_, seq.iterator())); } @Override public C.Sequence<T> append(Iterator<? extends T> iterator) { return of(Iterators.composite(itr_, iterator)); } @Override public C.Sequence<T> append(Enumeration<? extends T> enumeration) { return of(Iterators.composite(itr_, new EnumerationIterator<T>(enumeration))); } @Override public C.Sequence<T> append(T t) { return of(Iterators.composite(itr_, Iterators.of(t))); } @Override public C.Sequence<T> prepend(C.Sequence<? extends T> seq) { return of(Iterators.composite(seq.iterator(), itr_)); } @Override public C.Sequence<T> prepend(T t) { return of(Iterators.composite(Iterators.of(t), itr_)); } @Override public C.Sequence<T> filter($.Function<? super T, Boolean> predicate) { return of(Iterators.filter(itr_, predicate)); } @Override public int size() throws UnsupportedOperationException { throw new UnsupportedOperationException(); } @Override public <R> C.Sequence<R> map($.Function<? super T, ? extends R> mapper) { return new IteratorSeq<R>(Iterators.map(itr_, mapper)); } @Override public <R> C.Sequence<R> flatMap($.Function<? super T, ? extends Iterable<? extends R>> mapper ) { return new IteratorSeq<R>(Iterators.flatMap(itr_, mapper)); } static <T> IteratorSeq<T> of(Iterator<? extends T> itr) { return new IteratorSeq<T>(itr); } }