aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2016-01-13 20:44:10 +0000
committerMichael Williamson <mike@zwobble.org>2016-01-13 20:44:10 +0000
commit20fd6bebda70202767d4d150e0f0ae3749172206 (patch)
tree0dbc5d049f60ae3655240905ff052a77ad1773ab /src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java
parent6b3248373262ca30fff70728e24852bde8131042 (diff)
Extract upToAndIncluding iterable
Diffstat (limited to 'src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java')
-rw-r--r--src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java b/src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java
new file mode 100644
index 0000000..aef5d06
--- /dev/null
+++ b/src/main/java/org/zwobble/couscous/util/UpToAndIncludingIterable.java
@@ -0,0 +1,38 @@
+package org.zwobble.couscous.util;
+
+import java.util.Iterator;
+import java.util.NoSuchElementException;
+import java.util.function.Predicate;
+
+public class UpToAndIncludingIterable {
+ public static <T> Iterable<T> upToAndIncluding(Iterable<T> iterable, Predicate<T> predicate) {
+ return () -> new UpToIterator<>(iterable.iterator(), predicate);
+ }
+
+ private static class UpToIterator<T> implements Iterator<T> {
+ private final Iterator<T> iterator;
+ private final Predicate<T> predicate;
+ private boolean finished;
+
+ public UpToIterator(Iterator<T> iterator, Predicate<T> 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();
+ }
+ }
+ }
+}