diff options
| author | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2019-04-11 18:59:33 -0300 |
|---|---|---|
| committer | Benjamin J. Culkin <bjculkin@mix.wvu.edu> | 2019-04-11 18:59:33 -0300 |
| commit | 1e3e91f815e26d77569cea639a2cd26be21550ac (patch) | |
| tree | 378087de38044e031427ff316a8929b0b62d3069 /base/src/main/java/bjc/utils/funcutils | |
| parent | 16e1e23250063d7885b790d082d2118f83693028 (diff) | |
ChainIterators
Diffstat (limited to 'base/src/main/java/bjc/utils/funcutils')
| -rw-r--r-- | base/src/main/java/bjc/utils/funcutils/IteratorUtils.java | 34 |
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); + } } |
