package org.zwobble.couscous.util; import java.util.Iterator; import java.util.NoSuchElementException; import java.util.function.Predicate; public class UpToAndIncludingIterable { public static Iterable upToAndIncluding(Iterable iterable, Predicate predicate) { return () -> new UpToIterator<>(iterable.iterator(), predicate); } private static class UpToIterator implements Iterator { private final Iterator iterator; private final Predicate predicate; private boolean finished; public UpToIterator(Iterator iterator, Predicate predicate) { this.iterator = iterator; this.predicate = predicate; } @Override public boolean hasNext() { return !finished && iterator.hasNext(); } @Override public T next() { if (hasNext()) { T value = iterator.next(); finished = predicate.test(value); return value; } else { throw new NoSuchElementException(); } } } }