package com.codepoetics.octarine.functional.functions;
import java.util.function.BiFunction;
public interface F2<A, B, R> extends BiFunction<A, B, R> {
static <A, B, R> F2<A, B, R> of(BiFunction<? super A, ? super B, ? extends R> f) {
return f::apply;
}
static <A, B, R> F1<A, R> of(BiFunction<? super A, ? super B, ? extends R> f, B b) {
return a -> f.apply(a, b);
}
static <A, B, R> F2<A, B, R> unsafe(Unsafe<? super A, ? super B, ? extends R> f) {
return f::apply;
}
static <A, B, R> F1<A, R> unsafe(Unsafe<? super A, ? super B, ? extends R> f, B b) {
return a -> f.apply(a, b);
}
default F1<B, R> curry(A a) {
return b -> apply(a, b);
}
default F1<A, R> withParams(B b) {
return a -> apply(a, b);
}
default F0<R> curry(A a, B b) {
return () -> apply(a, b);
}
static interface Unsafe<A, B, R> extends F2<A, B, R> {
default R apply(A a, B b) {
try {
return applyUnsafe(a, b);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
R applyUnsafe(A a, B b) throws Exception;
}
}