summaryrefslogtreecommitdiff
path: root/base/src/main/java/bjc/utils/data/CircularIterator.java
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-08 22:39:59 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-10-08 22:39:59 -0300
commitc82e3b3b2de0633317ec8fc85925e91422820597 (patch)
tree96567416ce23c5ce85601f9cedc3a94bb1c55cba /base/src/main/java/bjc/utils/data/CircularIterator.java
parentb3ac1c8690c3e14c879913e5dcc03a5f5e14876e (diff)
Start splitting into maven modules
Diffstat (limited to 'base/src/main/java/bjc/utils/data/CircularIterator.java')
-rw-r--r--base/src/main/java/bjc/utils/data/CircularIterator.java81
1 files changed, 81 insertions, 0 deletions
diff --git a/base/src/main/java/bjc/utils/data/CircularIterator.java b/base/src/main/java/bjc/utils/data/CircularIterator.java
new file mode 100644
index 0000000..a708eba
--- /dev/null
+++ b/base/src/main/java/bjc/utils/data/CircularIterator.java
@@ -0,0 +1,81 @@
+package bjc.utils.data;
+
+import java.util.Iterator;
+
+/**
+ * An iterator that repeats elements from a provided iterable.
+ *
+ * @author EVE
+ *
+ * @param <E>
+ * The type of the iterable.
+ */
+public class CircularIterator<E> implements Iterator<E> {
+ /*
+ * The iterable, and our current iterator into it.
+ */
+ private Iterable<E> source;
+ private Iterator<E> curr;
+
+ /*
+ * Our current element.
+ */
+ private E curElm;
+
+ /*
+ * Should we actually get new iterators, or just repeat the last
+ * element?
+ */
+ private boolean doCircle;
+
+ /**
+ * Create a new circular iterator.
+ *
+ * @param src
+ * The iterable to iterate from.
+ *
+ * @param circ
+ * Should we actually do circular iteration, or just
+ * repeat the terminal element?
+ */
+ public CircularIterator(final Iterable<E> src, final boolean circ) {
+ source = src;
+ curr = source.iterator();
+
+ doCircle = circ;
+ }
+
+ /**
+ * Create a new circular iterator that does actual circular iteration.
+ *
+ * @param src
+ * The iterable to iterate from.
+ */
+ public CircularIterator(final Iterable<E> src) {
+ this(src, true);
+ }
+
+ @Override
+ public boolean hasNext() {
+ // We always have something
+ return true;
+ }
+
+ @Override
+ public E next() {
+ if (!curr.hasNext()) {
+ if (doCircle) {
+ curr = source.iterator();
+ } else return curElm;
+ }
+
+ curElm = curr.next();
+
+ return curElm;
+ }
+
+ @Override
+ public void remove() {
+ curr.remove();
+ }
+}