@Override public <B> IteratorMonadic<B> fmap(final Function<A, B> f) { return mlazy(new Iter<B>() { @Override public boolean hasNext() { return as.hasNext(); } @Override public B next() { return f.apply(as.next()); } }); }
@Override public <B> IteratorMonadic<B> mapIndex(final Function2<A, Integer, B> f) { return mlazy(new Iter<B>() { private int i = 0; @Override public boolean hasNext() { return as.hasNext(); } @Override public B next() { return f.apply(as.next(), i++); } }); }
@Override public IteratorMonadic<A> each(final Function<A, Void> e) { return mlazy(new Iter<A>() { @Override public boolean hasNext() { return as.hasNext(); } @Override public A next() { final A a = as.next(); e.apply(a); return a; } }); }
@Override public IteratorMonadic<A> eachIndex(final Function2<A, Integer, Void> e) { return mlazy(new Iter<A>() { private int i = 0; @Override public boolean hasNext() { return as.hasNext(); } @Override public A next() { final A a = as.next(); e.apply(a, i++); return a; } }); }
@Override public IteratorMonadic<A> take(final int n) { return mlazy(new Iter<A>() { private int count = 0; @Override public boolean hasNext() { return count < n && as.hasNext(); } @Override public A next() { if (count < n) { count++; return as.next(); } else { throw new NoSuchElementException(); } } }); }
@Override public <B> IteratorMonadic<B> bind(final Function<A, Iterator<B>> f) { return mlazy(new Iter<B>() { @Override public boolean hasNext() { return step.hasNext() || step().hasNext(); } @Override public B next() { if (step.hasNext()) { return step.next(); } else { return step().next(); } } // iterator state management private Iterator<B> step = Monadics.emptyIter(); private Iterator<B> step() { while (!step.hasNext() && as.hasNext()) { step = f.apply(as.next()); } return step; } }); }
/** Constructor function optimized for lists. */ public static <A> IteratorMonadic<A> mlazy(final List<A> as) { return mlazy(as.iterator()); }
/** Constructor function. */ public static <A> IteratorMonadic<A> mlazy(final Iterable<A> as) { return mlazy(as.iterator()); }
@Override public IteratorMonadic<A> filter(final Function<A, Boolean> p) { return mlazy(new Iter<A>() { private A next = null;
/** Constructor function optimized for arrays. */ public static <A> IteratorMonadic<A> mlazy(A... as) { return mlazy(iterator(as)); }