package xapi.fu;
/**
* @author James X. Nelson (james@wetheinter.net)
* Created on 07/11/15.
*/
@SuppressWarnings("unchecked")
public interface In3<I1, I2, I3> extends HasInput, Rethrowable, Lambda {
void in(I1 in1, I2 in2, I3 in3);
@Override
default int accept(int position, Object... values) {
in((I1)values[position++], (I2)values[position++], (I3)values[position++]);
return position;
}
static <I1, I2, I3> In3<I1, I2, I3> in3(In3<I1, I2, I3> of) {
return of;
}
default <N> In4<N, I1, I2, I3> requireBefore(In1<N> and){
return In4.in4(and, this);
}
default <N> In4<I1, I2, I3, N> requireAfter(In1<N> and){
return In4.in4(this, and);
}
default In3<I3, I2, I1> reverse(){
return (i3, i2, i1) -> in(i1, i2, i3);
}
default In3<I3, I1, I2> rotateRight(){
return (i3, i1, i2) -> in(i1, i2, i3);
}
default In3<I2, I3, I1> rotateLeft(){
return (i2, i3, i1) -> in(i1, i2, i3);
}
default In2<I2, I3> provide1(Out1<I1> and){
return (i2, i3) -> in(and.out1(), i2, i3);
}
default In2<I1, I3> provide2(Out1<I2> and){
return (i1, i3) -> in(i1, and.out1(), i3);
}
default In2<I1, I2> provide3(Out1<I3> and){
return (i1, i2) -> in(i1, i2, and.out1());
}
default In2<I2, I3> provide1(I1 and){
return (i2, i3) -> in(and, i2, i3);
}
default In2<I1, I3> provide2(I2 and){
return (i1, i3) -> in(i1, and, i3);
}
default In2<I1, I2> provide3(I3 and){
return (i1, i2) -> in(i1, i2, and);
}
static <I1, I2, I3> In3<I1, I2, I3> in3(In2<I1, I2> in12, In1<I3> in3) {
return (i1, i2, i3)-> {
in12.in(i1, i2);
in3.in(i3);
};
}
static <I1, I2, I3> In3<I1, I2, I3> in3(In1<I1> in1, In2<I2, I3> in23) {
return (i1, i2, i3)-> {
in1.in(i1);
in23.in(i2, i3);
};
}
static <I1, I2, I3> In3<I1, I2, I3> in3(In1<I1> in1, In1<I2> in2, In1<I3> in3) {
return (i1, i2, i3)-> {
in1.in(i1);
in2.in(i2);
in3.in(i3);
};
}
/**
* This method just exists to give you somewhere to create a lambda that will rethrow exceptions,
* but exposes an exceptionless api. If you don't have to call code with checked exceptions,
* prefer the standard {@link #in3(In3)}, as try/catch can disable / weaken some JIT compilers.
*/
static <I1, I2, I3> In3<I1, I2, I3> in3Unsafe(In3Unsafe<I1, I2, I3> of) {
return of;
}
interface In3Unsafe <I1, I2, I3> extends In3<I1, I2, I3> {
void inUnsafe(I1 in1, I2 in2, I3 in3) throws Throwable;
default void in(I1 in1, I2 in2, I3 in3) {
try {
inUnsafe(in1, in2, in3);
} catch (Throwable e) {
throw rethrow(e);
}
}
}
}