default IIterator<O, E> iterator(final IAcceptor<O> acceptor) { return new IIterator<O, E>() { private final IIterator<O, E> iterator = iterator(); private O item = null; @Override public boolean hasNext() throws E { while (this.iterator.hasNext()) { final O i = this.iterator.next(); if (acceptor.accept(i) && (this.item = i) != null) { return true; } } return false; } @Override public O next() throws E { try { if (this.item != null || hasNext()) { return this.item; } throw new NoSuchElementException(); } finally { this.item = null; } } }; }
@Override public IIterator<O, E> iterator() { return new IteratorFlattingIterator<>(this.input.iterator(), this.acceptor, this.converter); } }
@Override public IIterator<O, E> iterator() { return new IteratorConvertingIterator<>(this.input.iterator(), this.acceptor, this.converter); } }
@Override public IIterator<T, E> iterator() { return new IteratorFilteringIterator<>(this.input.iterator(), this.acceptor); } }
@Override public IIterator<O, E> iterator() { return new IteratorCountingIterator<>(this.input.iterator(), this.acceptor, this.aggegator); }
default O first(final IAcceptor<O> acceptor) throws E { final IIterator<O, E> iterator = this.iterator(); while (iterator.hasNext()) { final O value = iterator.next(); if (acceptor.accept(value)) { return value; } } return null; }
default void foreach(final IConsumer<O, E> consumer) throws E { final IIterator<O, E> iterator = this.iterator(); while (iterator.hasNext()) { final O value = iterator.next(); consumer.consume(value); } }
default <R> R aggregate(final R identity, final IAggregator<R, O, R, E> adder) throws E { final IIterator<O, E> iterator = this.iterator(); R result = identity; while (iterator.hasNext()) { result = adder.aggregate(result, iterator.next()); } return result; }
default void foreach(final IAssimilator<Integer, O, E> assimilator) throws E { final IIterator<O, E> iterator = this.iterator(); final IntCounter counter = new IntCounter(-1); while (iterator.hasNext()) { final O value = iterator.next(); assimilator.assimilate(counter.next(), value); } }