blob: 2e55a3d12cf6ebde2f8c190e43c1ed0d3a71619b (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
package bjc.utils.funcutils;
import java.util.function.BiFunction;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.UnaryOperator;
/**
* Utility things for functions.
*
* @author ben
*/
public class FuncUtils {
/**
* Convert a binary function into a unary function that returns a
* function.
*
* @param <A>
* The initial type of the function.
*
* @param <B>
* The intermediate type of the function.
*
* @param <C>
* 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 <A, B, C> Function<A, Function<B, C>> curry2(final BiFunction<A, B, C> 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<Integer> 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.
*
* @return The requested operator.
*/
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;
};
}
}
|