package bjc.utils.funcutils; import java.util.function.BiFunction; import java.util.function.Consumer; import java.util.function.Function; /** * Utility things for functions * * @author ben * */ public class FuncUtils { /** * Convert a binary function into a unary function that returns a * function * * @param * The initial type of the function * @param * The intermediate type of the function * @param * The terminal type of the function * @param func * The function to transform * @return The function transformed into a unary function returning a * function */ public static Function> curry2(final BiFunction func) { return arg1 -> arg2 -> { return func.apply(arg1, arg2); }; } /** * Do the specified action the specified number of times * * @param nTimes * The number of times to do the action * @param cons * The action to perform */ public static void doTimes(final int nTimes, final Consumer cons) { for (int i = 0; i < nTimes; i++) { 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 UnaryOperator converge(final UnaryOperator 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; }; } }