From 1e3e91f815e26d77569cea639a2cd26be21550ac Mon Sep 17 00:00:00 2001 From: "Benjamin J. Culkin" Date: Thu, 11 Apr 2019 18:59:33 -0300 Subject: ChainIterators --- .../java/bjc/utils/funcutils/IteratorUtils.java | 34 ++++++++++++++++++++++ 1 file changed, 34 insertions(+) (limited to 'base/src/main/java/bjc/utils/funcutils') 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 implements Iterator { + private Iterator mainItr; + private Function> trans; + + private Iterator curItr; + + public ChainIterator(Iterator mainItr, Function> 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 Iterator I(Iterable itr) { return itr.iterator(); } + + public static Iterator chain(Iterator itrA, Function> itrB) { + return new ChainIterator(itrA, itrB); + } } -- cgit v1.2.3