| 1 | package com.github.dakusui.pcond.experimentals.currying.multi; | |
| 2 | ||
| 3 | import com.github.dakusui.pcond.core.printable.PrintableFunction; | |
| 4 | ||
| 5 | import java.util.ArrayList; | |
| 6 | import java.util.LinkedList; | |
| 7 | import java.util.List; | |
| 8 | import java.util.Objects; | |
| 9 | import java.util.function.Function; | |
| 10 | import java.util.function.Supplier; | |
| 11 | ||
| 12 | import static com.github.dakusui.pcond.internals.InternalChecks.requireArgumentListSize; | |
| 13 | import static java.util.Objects.requireNonNull; | |
| 14 | import static java.util.stream.Collectors.joining; | |
| 15 | ||
| 16 | /** | |
| 17 | * An interface that represents a function that can have more than one parameters. | |
| 18 | * This interface is often used in combination with {@link com.github.dakusui.pcond.forms.Functions#curry(MultiFunction)} method. | |
| 19 | * | |
| 20 | * @param <R> The type of the returned value. | |
| 21 | */ | |
| 22 | public interface MultiFunction<R> extends Function<List<? super Object>, R> { | |
| 23 | /** | |
| 24 | * Returns a name of this function. | |
| 25 | * | |
| 26 | * @return The name of this function. | |
| 27 | */ | |
| 28 | String name(); | |
| 29 | ||
| 30 | /** | |
| 31 | * Returns the number of parameters that this function can take. | |
| 32 | * | |
| 33 | * @return the number of parameters | |
| 34 | */ | |
| 35 | int arity(); | |
| 36 | ||
| 37 | /** | |
| 38 | * The expected type of the {@code i}th parameter. | |
| 39 | * | |
| 40 | * @param i The parameter index. | |
| 41 | * @return The type of {@code i}th parameter. | |
| 42 | */ | |
| 43 | Class<?> parameterType(int i); | |
| 44 | ||
| 45 | /** | |
| 46 | * The type of the value returned by this function. | |
| 47 | * | |
| 48 | * @return The type of the returned value. | |
| 49 | */ | |
| 50 | Class<? extends R> returnType(); | |
| 51 | ||
| 52 | class Impl<R> extends PrintableFunction<List<? super Object>, R> implements MultiFunction<R> { | |
| 53 | private final String name; | |
| 54 | private final List<Class<?>> parameterTypes; | |
| 55 | ||
| 56 | protected Impl( | |
| 57 | Object creator, | |
| 58 | List<Object> args, | |
| 59 | Supplier<String> formatter, | |
| 60 | String name, | |
| 61 | Function<? super List<? super Object>, ? extends R> function, | |
| 62 | List<Class<?>> parameterTypes) { | |
| 63 | super( | |
| 64 | creator, | |
| 65 | args, | |
| 66 | formatter, | |
| 67 | function); | |
| 68 | this.name = name; | |
| 69 | this.parameterTypes = new ArrayList<>(parameterTypes); | |
| 70 | } | |
| 71 | ||
| 72 | @Override | |
| 73 | public String name() { | |
| 74 |
1
1. name : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Impl::name → KILLED |
return name; |
| 75 | } | |
| 76 | ||
| 77 | @Override | |
| 78 | public int arity() { | |
| 79 |
1
1. arity : replaced int return with 0 for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Impl::arity → KILLED |
return parameterTypes.size(); |
| 80 | } | |
| 81 | ||
| 82 | @Override | |
| 83 | public Class<?> parameterType(int i) { | |
| 84 |
1
1. parameterType : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Impl::parameterType → KILLED |
return parameterTypes.get(i); |
| 85 | } | |
| 86 | ||
| 87 | } | |
| 88 | ||
| 89 | /** | |
| 90 | * A builder for a {@link MultiFunction} instance. | |
| 91 | * | |
| 92 | * @param <R> The type of value returned by the multi-function built by this object. | |
| 93 | */ | |
| 94 | class Builder<R> { | |
| 95 | private final Object creator = Builder.class; | |
| 96 | private List<Object> identityArgs; | |
| 97 | private String name = "(anonymous)"; | |
| 98 | private final Function<? super List<? super Object>, ? extends R> body; | |
| 99 | private final List<Class<?>> parameterTypes = new LinkedList<>(); | |
| 100 |
1
1. lambda$new$0 : replaced return value with "" for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::lambda$new$0 → NO_COVERAGE |
private Supplier<String> formatter = () -> name + "(" + parameterTypes.stream().map(Class::getSimpleName).collect(joining(",")) + ")"; |
| 101 | ||
| 102 | public Builder(Function<List<Object>, R> body) { | |
| 103 | requireNonNull(body); | |
| 104 |
1
1. lambda$new$1 : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::lambda$new$1 → KILLED |
this.body = args -> body.apply(requireArgumentListSize(requireNonNull(args), parameterTypes.size())); |
| 105 | } | |
| 106 | ||
| 107 | public Builder<R> addParameters(List<Class<?>> parameterTypes) { | |
| 108 |
1
1. addParameters : removed call to java/util/stream/Stream::forEach → KILLED |
requireNonNull(parameterTypes).stream().map(this::addParameter).forEach(Objects::requireNonNull); |
| 109 |
1
1. addParameters : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::addParameters → KILLED |
return this; |
| 110 | } | |
| 111 | ||
| 112 | public Builder<R> identityArgs(List<Object> identity) { | |
| 113 | this.identityArgs = requireNonNull(identity); | |
| 114 |
1
1. identityArgs : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::identityArgs → KILLED |
return this; |
| 115 | } | |
| 116 | ||
| 117 | public Builder<R> name(String name) { | |
| 118 | this.name = name; | |
| 119 |
1
1. name : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::name → KILLED |
return this; |
| 120 | } | |
| 121 | ||
| 122 | public Builder<R> addParameter(Class<?> parameterType) { | |
| 123 | this.parameterTypes.add(requireNonNull(parameterType)); | |
| 124 |
1
1. addParameter : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::addParameter → KILLED |
return this; |
| 125 | } | |
| 126 | ||
| 127 | public Builder<R> formatter(Supplier<String> formatter) { | |
| 128 | this.formatter = requireNonNull(formatter); | |
| 129 |
1
1. formatter : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::formatter → KILLED |
return this; |
| 130 | } | |
| 131 | ||
| 132 | public MultiFunction<R> $() { | |
| 133 |
1
1. $ : replaced return value with null for com/github/dakusui/pcond/experimentals/currying/multi/MultiFunction$Builder::$ → KILLED |
return new Impl<R>( |
| 134 | this.creator, | |
| 135 | this.identityArgs, | |
| 136 | this.formatter, | |
| 137 | this.name, | |
| 138 | this.body, | |
| 139 | this.parameterTypes | |
| 140 | ); | |
| 141 | } | |
| 142 | } | |
| 143 | } | |
Mutations | ||
| 74 |
1.1 |
|
| 79 |
1.1 |
|
| 84 |
1.1 |
|
| 100 |
1.1 |
|
| 104 |
1.1 |
|
| 108 |
1.1 |
|
| 109 |
1.1 |
|
| 114 |
1.1 |
|
| 119 |
1.1 |
|
| 124 |
1.1 |
|
| 129 |
1.1 |
|
| 133 |
1.1 |