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