summaryrefslogtreecommitdiff
path: root/src/main/java/bjc/data/GeneratingIterator.java
diff options
context:
space:
mode:
authorbculkin2442 <bjculkin@mix.wvu.edu>2019-07-02 18:05:22 -0400
committerbculkin2442 <bjculkin@mix.wvu.edu>2019-07-02 18:05:22 -0400
commit843329de434bb334d90927c4d22345373a388530 (patch)
treeb0ad1f764bd29ff43841e1095a5b58194c20cb37 /src/main/java/bjc/data/GeneratingIterator.java
parentac36f171a3cebb0993cc28548635e3f654f8e325 (diff)
Rename package root
The package root is now bjc, not io.github.bculkin2442.
Diffstat (limited to 'src/main/java/bjc/data/GeneratingIterator.java')
-rw-r--r--src/main/java/bjc/data/GeneratingIterator.java60
1 files changed, 60 insertions, 0 deletions
diff --git a/src/main/java/bjc/data/GeneratingIterator.java b/src/main/java/bjc/data/GeneratingIterator.java
new file mode 100644
index 0000000..9adda6f
--- /dev/null
+++ b/src/main/java/bjc/data/GeneratingIterator.java
@@ -0,0 +1,60 @@
+package bjc.data;
+
+import java.util.Iterator;
+import java.util.function.Predicate;
+import java.util.function.UnaryOperator;
+
+/**
+ * An iterator that generates a series of elements from a single element.
+ *
+ * @author bjculkin
+ *
+ * @param <E>
+ * The type of element generated.
+ */
+public class GeneratingIterator<E> implements Iterator<E> {
+ /* Our current state. */
+ private E state;
+ /* The function to use to transition states. */
+ private UnaryOperator<E> transtion;
+ /* The predicate to indicate where to stop. */
+ private Predicate<E> stpper;
+
+ /**
+ * Create a new generative iterator.
+ *
+ * @param initial
+ * The initial state of the generator.
+ *
+ * @param transition
+ * The function to apply to the state.
+ *
+ * @param stopper
+ * The predicate applied to the current state to determine when
+ * to stop.
+ */
+ public GeneratingIterator(E initial, UnaryOperator<E> transition, Predicate<E> stopper) {
+ state = initial;
+ transtion = transition;
+ stpper = stopper;
+ }
+
+ @Override
+ public boolean hasNext() {
+ return stpper.test(state);
+ }
+
+ /*
+ * @NOTE
+ *
+ * As this currently is, it only works correctly assuming that next() is
+ * only called when hasNext() is true. Should we safeguard against
+ * people who are not doing the right thing?
+ */
+ @Override
+ public E next() {
+ state = transtion.apply(state);
+
+ return state;
+ }
+}