| 1 | package com.github.dakusui.pcond.experimentals.currying; | |
| 2 | ||
| 3 | import com.github.dakusui.pcond.experimentals.currying.context.CurriedContext; | |
| 4 | import com.github.dakusui.pcond.experimentals.currying.multi.MultiFunction; | |
| 5 | import com.github.dakusui.pcond.core.printable.PrintableFunctionFactory; | |
| 6 | ||
| 7 | import java.util.List; | |
| 8 | import java.util.function.Function; | |
| 9 | import java.util.function.Supplier; | |
| 10 | import java.util.stream.IntStream; | |
| 11 | import java.util.stream.Stream; | |
| 12 | ||
| 13 | import static com.github.dakusui.pcond.internals.InternalUtils.formatObject; | |
| 14 | import static java.util.Arrays.asList; | |
| 15 | import static java.util.Collections.emptyList; | |
| 16 | import static java.util.stream.Collectors.joining; | |
| 17 | ||
| 18 | /** | |
| 19 | * Intended for internal use only. | |
| 20 | */ | |
| 21 | public enum CurryingUtils { | |
| 22 | ; | |
| 23 | private static final ThreadLocal<Function<List<Object>, CurriedFunction<Object, Object>>> CURRIED_FUNCTION_FACTORY_POOL = new ThreadLocal<>(); | |
| 24 | ||
| 25 | public static CurriedFunction<Object, Object> curry(MultiFunction<Object> function) { | |
| 26 |
1
1. curry : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::curry → KILLED |
return curry(function, emptyList()); |
| 27 | } | |
| 28 | ||
| 29 | public static Function<List<Object>, CurriedFunction<Object, Object>> currier() { | |
| 30 |
1
1. currier : negated conditional → KILLED |
if (CURRIED_FUNCTION_FACTORY_POOL.get() == null) |
| 31 |
1
1. currier : removed call to java/lang/ThreadLocal::set → SURVIVED |
CURRIED_FUNCTION_FACTORY_POOL.set((List<Object> args) -> |
| 32 |
1
1. lambda$currier$3 : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$currier$3 → KILLED |
PrintableFunctionFactory.create( |
| 33 |
3
1. lambda$null$0 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$null$0 → KILLED 2. lambda$null$1 : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$null$1 → KILLED 3. lambda$null$2 : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$null$2 → KILLED |
(args_) -> () -> functionNameFormatter(functionName(args_), ongoingContext(args_)).apply(function(args_)), (args_) -> new CurriedFunction.Impl(function(args_), ongoingContext(args_)), args, CurryingUtils.class |
| 34 | )); | |
| 35 |
1
1. currier : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::currier → KILLED |
return CURRIED_FUNCTION_FACTORY_POOL.get(); |
| 36 | } | |
| 37 | ||
| 38 | public static <R> Function<CurriedContext, R> applyCurriedFunction(CurriedFunction<Object, Object> curriedFunction, int... orderArgs) { | |
| 39 |
1
1. applyCurriedFunction : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::applyCurriedFunction → KILLED |
return context -> { |
| 40 | CurriedFunction<?, ?> cur = curriedFunction; | |
| 41 | int[] normalizedOrderArgs = normalizeOrderArgs(context, orderArgs); | |
| 42 |
4
1. lambda$applyCurriedFunction$4 : changed conditional boundary → KILLED 2. lambda$applyCurriedFunction$4 : Changed increment from 1 to -1 → KILLED 3. lambda$applyCurriedFunction$4 : Replaced integer subtraction with addition → KILLED 4. lambda$applyCurriedFunction$4 : negated conditional → KILLED |
for (int i = 0; i < normalizedOrderArgs.length - 1; i++) |
| 43 | cur = cur.applyNext(context.valueAt(normalizedOrderArgs[i])); | |
| 44 |
2
1. lambda$applyCurriedFunction$4 : Replaced integer subtraction with addition → KILLED 2. lambda$applyCurriedFunction$4 : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$applyCurriedFunction$4 → KILLED |
return cur.applyLast(context.valueAt(normalizedOrderArgs[context.size() - 1])); |
| 45 | }; | |
| 46 | } | |
| 47 | ||
| 48 | public static int[] normalizeOrderArgs(CurriedContext curriedContext, int[] orderArgs) { | |
| 49 | int[] order; | |
| 50 |
1
1. normalizeOrderArgs : negated conditional → KILLED |
if (orderArgs.length == 0) |
| 51 | order = IntStream.range(0, curriedContext.size()).toArray(); | |
| 52 | else | |
| 53 | order = orderArgs; | |
| 54 |
1
1. normalizeOrderArgs : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::normalizeOrderArgs → KILLED |
return order; |
| 55 | } | |
| 56 | ||
| 57 | static CurriedFunction<Object, Object> curry(MultiFunction<Object> function, List<? super Object> ongoingContext) { | |
| 58 |
1
1. curry : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::curry → KILLED |
return currier().apply(asList(function.name(), function, ongoingContext)); |
| 59 | } | |
| 60 | ||
| 61 | private static String functionName(List<Object> args) { | |
| 62 |
1
1. functionName : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::functionName → KILLED |
return (String) args.get(0); |
| 63 | } | |
| 64 | ||
| 65 | @SuppressWarnings("unchecked") | |
| 66 | private static MultiFunction<Object> function(List<Object> args) { | |
| 67 |
1
1. function : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::function → KILLED |
return (MultiFunction<Object>) args.get(1); |
| 68 | } | |
| 69 | ||
| 70 | @SuppressWarnings("unchecked") | |
| 71 | private static List<? super Object> ongoingContext(List<Object> args) { | |
| 72 |
1
1. ongoingContext : replaced return value with Collections.emptyList for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::ongoingContext → KILLED |
return (List<? super Object>) args.get((2)); |
| 73 | } | |
| 74 | ||
| 75 | private static Function<MultiFunction<Object>, String> functionNameFormatter(String functionName, List<? super Object> ongoingContext) { | |
| 76 |
2
1. functionNameFormatter : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::functionNameFormatter → KILLED 2. lambda$functionNameFormatter$7 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$functionNameFormatter$7 → KILLED |
return (MultiFunction<Object> function) -> functionName + |
| 77 |
1
1. lambda$functionNameFormatter$7 : negated conditional → KILLED |
(!ongoingContext.isEmpty() ? IntStream.range(0, ongoingContext.size()) |
| 78 |
1
1. lambda$null$5 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$null$5 → KILLED |
.mapToObj(i -> function.parameterType(i).getSimpleName() + ":" + ongoingContext.get(i)) |
| 79 | .collect(joining(",", "(", ")")) : "") + | |
| 80 | IntStream.range(ongoingContext.size(), function.arity()) | |
| 81 |
1
1. lambda$null$6 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$null$6 → KILLED |
.mapToObj(i -> "(" + function.parameterType(i).getSimpleName() + ")") |
| 82 | .collect(joining()); | |
| 83 | } | |
| 84 | ||
| 85 | public static String formatParameterOrder(List<Integer> paramOrder) { | |
| 86 | String formatted = formatParamOrder(paramOrder.stream()); | |
| 87 | String uncustomized = formatParamOrder(IntStream.range(0, paramOrder.size()).boxed()); | |
| 88 |
2
1. formatParameterOrder : negated conditional → KILLED 2. formatParameterOrder : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::formatParameterOrder → KILLED |
return formatted.equals(uncustomized) ? |
| 89 | "" : | |
| 90 | formatted; | |
| 91 | } | |
| 92 | ||
| 93 | private static String formatParamOrder(Stream<Integer> paramOrderStream) { | |
| 94 |
1
1. formatParamOrder : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::formatParamOrder → KILLED |
return paramOrderStream.map(Object::toString).collect(joining(",", "(", ")")); |
| 95 | } | |
| 96 | ||
| 97 | static Supplier<String> messageInvalidTypeArgument(Object value, Class<?> aClass) { | |
| 98 |
3
1. lambda$messageInvalidTypeArgument$8 : negated conditional → KILLED 2. lambda$messageInvalidTypeArgument$8 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::lambda$messageInvalidTypeArgument$8 → KILLED 3. messageInvalidTypeArgument : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/CurryingUtils::messageInvalidTypeArgument → KILLED |
return () -> "Given argument:" + formatObject(value) + |
| 99 | (value == null ? | |
| 100 | "" : | |
| 101 | "(" + value.getClass() + ")") + | |
| 102 | " cannot be assigned to parameter:" + aClass.getCanonicalName(); | |
| 103 | } | |
| 104 | } | |
Mutations | ||
| 26 |
1.1 |
|
| 30 |
1.1 |
|
| 31 |
1.1 |
|
| 32 |
1.1 |
|
| 33 |
1.1 2.2 3.3 |
|
| 35 |
1.1 |
|
| 39 |
1.1 |
|
| 42 |
1.1 2.2 3.3 4.4 |
|
| 44 |
1.1 2.2 |
|
| 50 |
1.1 |
|
| 54 |
1.1 |
|
| 58 |
1.1 |
|
| 62 |
1.1 |
|
| 67 |
1.1 |
|
| 72 |
1.1 |
|
| 76 |
1.1 2.2 |
|
| 77 |
1.1 |
|
| 78 |
1.1 |
|
| 81 |
1.1 |
|
| 88 |
1.1 2.2 |
|
| 94 |
1.1 |
|
| 98 |
1.1 2.2 3.3 |