summaryrefslogtreecommitdiff
path: root/base
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2019-04-11 18:59:33 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2019-04-11 18:59:33 -0300
commit1e3e91f815e26d77569cea639a2cd26be21550ac (patch)
tree378087de38044e031427ff316a8929b0b62d3069 /base
parent16e1e23250063d7885b790d082d2118f83693028 (diff)
ChainIterators
Diffstat (limited to 'base')
-rw-r--r--base/src/main/java/bjc/utils/funcutils/IteratorUtils.java34
1 files changed, 34 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java
index c639da6..3cdee26 100644
--- a/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java
+++ b/base/src/main/java/bjc/utils/funcutils/IteratorUtils.java
@@ -10,6 +10,36 @@ import java.util.function.Function;
*
*/
public class IteratorUtils {
+ public static class ChainIterator<T1, T2> implements Iterator<T2> {
+ private Iterator<T1> mainItr;
+ private Function<T1, Iterator<T2>> trans;
+
+ private Iterator<T2> curItr;
+
+ public ChainIterator(Iterator<T1> mainItr, Function<T1, Iterator<T2>> trans) {
+ this.mainItr = mainItr;
+ this.trans = trans;
+ }
+
+ @Override
+ public boolean hasNext() {
+ if (curItr != null) {
+ if (curItr.hasNext()) return true;
+ else return mainItr.hasNext();
+ }
+
+ return mainItr.hasNext();
+ }
+
+ @Override
+ public T2 next() {
+ if (curItr == null || !curItr.hasNext()) {
+ curItr = trans.apply(mainItr.next());
+ }
+
+ return curItr.next();
+ }
+ }
/**
* Convert an iterator to an iterable.
*
@@ -31,4 +61,8 @@ public class IteratorUtils {
public static <E> Iterator<E> I(Iterable<E> itr) {
return itr.iterator();
}
+
+ public static <A, B> Iterator<B> chain(Iterator<A> itrA, Function<A, Iterator<B>> itrB) {
+ return new ChainIterator(itrA, itrB);
+ }
}