diff options
Diffstat (limited to 'src/main/java/org/zwobble/couscous/util/ExtraIterables.java')
| -rw-r--r-- | src/main/java/org/zwobble/couscous/util/ExtraIterables.java | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java index 1fd9fca..cd9b3df 100644 --- a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java +++ b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java @@ -1,7 +1,14 @@ package org.zwobble.couscous.util; +import com.google.common.collect.Iterables; + import java.util.Iterator; import java.util.function.BiFunction; +import java.util.function.Function; +import java.util.stream.Stream; +import java.util.stream.StreamSupport; + +import static org.zwobble.couscous.util.ExtraLists.list; public class ExtraIterables { private ExtraIterables() {} @@ -69,4 +76,44 @@ public class ExtraIterables { } }; } + + public static <T> Iterable<T> lazyCons(T head, Iterable<T> tails) { + return Iterables.concat(list(head), tails); + } + + public static <T, R> Iterable<R> lazyMap(Iterable<T> iterable, Function<T, R> function) { + return new Iterable<R>() { + @Override + public Iterator<R> iterator() { + return map(iterable.iterator(), function); + } + }; + } + + private static <T, R> Iterator<R> map(Iterator<T> iterator, Function<T, R> function) { + return new Iterator<R>() { + @Override + public boolean hasNext() { + return iterator.hasNext(); + } + + @Override + public R next() { + return function.apply(iterator.next()); + } + }; + } + + public static <T, R> Iterable<R> lazyFlatMap(Iterable<T> iterable, Function<T, Iterable<R>> function) { + return new Iterable<R>() { + @Override + public Iterator<R> iterator() { + return stream(iterable).flatMap(element -> stream(function.apply(element))).iterator(); + } + }; + } + + public static <T> Stream<T> stream(Iterable<T> iterable) { + return StreamSupport.stream(iterable.spliterator(), false); + } } |
