summaryrefslogtreecommitdiff
path: root/BJC-Utils2/src/main
diff options
context:
space:
mode:
authorBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-09-11 12:12:10 -0300
committerBenjamin J. Culkin <bjculkin@mix.wvu.edu>2017-09-11 12:12:10 -0300
commitc5145da9d7ac09b4aa15ac1e5652b841a6598072 (patch)
treed9b185df77a9098e2864df2853451640d20a9cab /BJC-Utils2/src/main
parent0a158db894299a05dac881c7c829bd69ab464d24 (diff)
Add converge combinator
Adds a function that creates a function that iterates an operator until it either converges or exceeds a defined number of iterations.
Diffstat (limited to 'BJC-Utils2/src/main')
-rw-r--r--BJC-Utils2/src/main/java/bjc/utils/funcutils/FuncUtils.java27
1 files changed, 27 insertions, 0 deletions
diff --git a/BJC-Utils2/src/main/java/bjc/utils/funcutils/FuncUtils.java b/BJC-Utils2/src/main/java/bjc/utils/funcutils/FuncUtils.java
index 0d1a688..cd1bcc9 100644
--- a/BJC-Utils2/src/main/java/bjc/utils/funcutils/FuncUtils.java
+++ b/BJC-Utils2/src/main/java/bjc/utils/funcutils/FuncUtils.java
@@ -45,4 +45,31 @@ public class FuncUtils {
cons.accept(i);
}
}
+
+ /**
+ * Return an operator that executes until it converges.
+ *
+ * @param op
+ * The operator to execute.
+ * @param maxTries
+ * The maximum amount of times to apply the function in an
+ * attempt to cause it to converge.
+ */
+ public static <T> UnaryOperator<T> converge(final UnaryOperator<T> op, final int maxTries) {
+ return (val) -> {
+ T newVal = op.apply(val);
+ T oldVal;
+
+ int tries = 0;
+
+ do {
+ oldVal = newVal;
+ newVal = op.apply(newVal);
+
+ tries += 1;
+ } while(!newVal.equals(oldVal) && tries < maxTries);
+
+ return newVal;
+ };
+ }
}