package com.codepoetics.octarine.functional.extractors;
import com.codepoetics.octarine.functional.functions.F3;
import com.codepoetics.octarine.functional.functions.F4;
import com.codepoetics.octarine.functional.functions.F5;
import java.util.function.BiFunction;
import java.util.function.Function;
import java.util.function.Predicate;
public class Extractors {
private Extractors() {
}
public static <S> Extractor<S, S> it() {
return Extractor.from(s -> true, Function.identity());
}
public static <S, A, B, J> Extractor<S, J> join(
Extractor<? super S, ? extends A> first,
Extractor<? super S, ? extends B> second,
BiFunction<? super A, ? super B, ? extends J> receiver) {
return Extractor.from(
input -> first.test(input) && second.test(input),
input -> receiver.apply(first.extract(input), second.extract(input)));
}
public static <S, A, B, C, T> Extractor<S, T> join(
Extractor<? super S, ? extends A> extractorA,
Extractor<? super S, ? extends B> extractorB,
Extractor<? super S, ? extends C> extractorC,
F3<? super A, ? super B, ? super C, ? extends T> receiver) {
return Extractor.from(
input -> extractorA.test(input) && extractorB.test(input) && extractorC.test(input),
input -> receiver.apply(extractorA.extract(input), extractorB.extract(input), extractorC.extract(input)));
}
public static <S, A, B, C, D, T> Extractor<S, T> join(
Extractor<? super S, ? extends A> extractorA,
Extractor<? super S, ? extends B> extractorB,
Extractor<? super S, ? extends C> extractorC,
Extractor<? super S, ? extends D> extractorD,
F4<? super A, ? super B, ? super C, ? super D, ? extends T> receiver) {
return Extractor.from(
input -> extractorA.test(input) && extractorB.test(input) && extractorC.test(input) && extractorD.test(input),
input -> receiver.apply(extractorA.extract(input), extractorB.extract(input), extractorC.extract(input), extractorD.extract(input)));
}
public static <S, A, B, C, D, E, T> Extractor<S, T> join(
Extractor<? super S, ? extends A> extractorA,
Extractor<? super S, ? extends B> extractorB,
Extractor<? super S, ? extends C> extractorC,
Extractor<? super S, ? extends D> extractorD,
Extractor<? super S, ? extends E> extractorE,
F5<? super A, ? super B, ? super C, ? super D, ? super E, ? extends T> receiver) {
return Extractor.from(
input -> extractorA.test(input) && extractorB.test(input) && extractorC.test(input) && extractorD.test(input) && extractorE.test(input),
input -> receiver.apply(extractorA.extract(input), extractorB.extract(input), extractorC.extract(input), extractorD.extract(input), extractorE.extract(input)));
}
public static <S, T> Extractor<S, T> join(
Predicate<? super S> predicate,
Extractor<? super S, ? extends T> extractor) {
return Extractor.from(
input -> predicate.test(input) && extractor.test(input),
input -> extractor.extract(input)); // method reference won't compile
}
}