aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/org/zwobble/couscous/util/ExtraIterables.java
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/org/zwobble/couscous/util/ExtraIterables.java')
-rw-r--r--src/main/java/org/zwobble/couscous/util/ExtraIterables.java54
1 files changed, 54 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 9cdb0f0..1fd9fca 100644
--- a/src/main/java/org/zwobble/couscous/util/ExtraIterables.java
+++ b/src/main/java/org/zwobble/couscous/util/ExtraIterables.java
@@ -1,6 +1,7 @@
package org.zwobble.couscous.util;
import java.util.Iterator;
+import java.util.function.BiFunction;
public class ExtraIterables {
private ExtraIterables() {}
@@ -15,4 +16,57 @@ public class ExtraIterables {
throw new RuntimeException("Iterables not of same length");
}
}
+
+ public static <T1, T2, R> Iterable<R> map(Iterable<T1> iterable1, Iterable<T2> iterable2, BiFunction<T1, T2, R> function) {
+ return new Iterable<R>() {
+ @Override
+ public Iterator<R> iterator() {
+ Iterator<T1> iterator1 = iterable1.iterator();
+ Iterator<T2> iterator2 = iterable2.iterator();
+ return map(iterator1, iterator2, function);
+ }
+ };
+ }
+
+ private static <R, T1, T2> Iterator<R> map(Iterator<T1> iterator1, Iterator<T2> iterator2, BiFunction<T1, T2, R> function) {
+ return new Iterator<R>() {
+ @Override
+ public boolean hasNext() {
+ return iterator1.hasNext() && iterator2.hasNext();
+ }
+
+ @Override
+ public R next() {
+ return function.apply(iterator1.next(), iterator2.next());
+ }
+ };
+ }
+
+ public static <T> Iterable<T> cast(Class<T> type, Iterable<?> iterable) {
+ return new Iterable<T>() {
+ @Override
+ public Iterator<T> iterator() {
+ return cast(type, iterable.iterator());
+ }
+ };
+ }
+
+ private static <T> Iterator<T> cast(Class<T> type, Iterator<?> iterator) {
+ return new Iterator<T>() {
+ @Override
+ public boolean hasNext() {
+ return iterator.hasNext();
+ }
+
+ @Override
+ public T next() {
+ Object next = iterator.next();
+ if (type.isInstance(next)) {
+ return (T) next;
+ } else {
+ throw new ClassCastException();
+ }
+ }
+ };
+ }
}