RosettaCodeData/Task/Y-combinator/Java/y-combinator-7.java

44 lines
1.5 KiB
Java
Raw Permalink Normal View History

2015-02-20 00:35:01 -05:00
import java.util.Arrays;
2015-11-18 06:14:39 +00:00
import java.util.Optional;
2015-02-20 00:35:01 -05:00
import java.util.function.Function;
2015-11-18 06:14:39 +00:00
import java.util.function.BiFunction;
2015-02-20 00:35:01 -05:00
@FunctionalInterface
2015-11-18 06:14:39 +00:00
public interface VarargsFunction<INPUTS, OUTPUT> extends Function<INPUTS[], OUTPUT> {
@SuppressWarnings("unchecked")
public OUTPUT apply(INPUTS... inputs);
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
public static <INPUTS, OUTPUT> VarargsFunction<INPUTS, OUTPUT> from(Function<INPUTS[], OUTPUT> function) {
return function::apply;
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
public static <INPUTS, OUTPUT> VarargsFunction<INPUTS, OUTPUT> upgrade(Function<INPUTS, OUTPUT> function) {
return inputs -> function.apply(inputs[0]);
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
public static <INPUTS, OUTPUT> VarargsFunction<INPUTS, OUTPUT> upgrade(BiFunction<INPUTS, INPUTS, OUTPUT> function) {
return inputs -> function.apply(inputs[0], inputs[1]);
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
@SuppressWarnings("unchecked")
public default <POST_OUTPUT> VarargsFunction<INPUTS, POST_OUTPUT> andThen(
VarargsFunction<OUTPUT, POST_OUTPUT> after) {
return inputs -> after.apply(apply(inputs));
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
@SuppressWarnings("unchecked")
public default Function<INPUTS, OUTPUT> toFunction() {
return input -> apply(input);
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
@SuppressWarnings("unchecked")
public default BiFunction<INPUTS, INPUTS, OUTPUT> toBiFunction() {
return (input, input2) -> apply(input, input2);
}
2015-02-20 00:35:01 -05:00
2015-11-18 06:14:39 +00:00
@SuppressWarnings("unchecked")
public default <PRE_INPUTS> VarargsFunction<PRE_INPUTS, OUTPUT> transformArguments(Function<PRE_INPUTS, INPUTS> transformer) {
return inputs -> apply((INPUTS[]) Arrays.stream(inputs).parallel().map(transformer).toArray());
2015-02-20 00:35:01 -05:00
}
}