package xapi.fu; /** * @author James X. Nelson (james@wetheinter.net) * Created on 07/11/15. */ @SuppressWarnings("unchecked") public interface In4<I1, I2, I3, I4> extends HasInput, Rethrowable, Lambda { void in(I1 in1, I2 in2, I3 in3, I4 in4); @Override default int accept(int position, Object... values) { in((I1)values[position++],(I2)values[position++],(I3)values[position++],(I4)values[position++]); return position; } default <N> InMany requireBefore(In1<N> and){ return InMany.of(and, this); } default <N> InMany requireAfter(In1<N> and){ return InMany.of(this, and); } default In4<I4, I3, I2, I1> reverse(){ return (i4, i3, i2, i1) -> in(i1, i2, i3, i4); } default In4<I4, I1, I2, I3> rotateRight(){ return (i4, i1, i2, i3) -> in(i1, i2, i3, i4); } default In4<I2, I3, I4, I1> rotateLeft(){ return (i2, i3, i4, i1) -> in(i1, i2, i3, i4); } default In3<I2, I3, I4> provide1(Out1<I1> and){ return (i2, i3, i4) -> in(and.out1(), i2, i3, i4); } default In3<I1, I3, I4> provide2(Out1<I2> and){ return (i1, i3, i4) -> in(i1, and.out1(), i3, i4); } default In3<I1, I2, I4> provide3(Out1<I3> and){ return (i1, i2, i4) -> in(i1, i2, and.out1(), i4); } default In3<I1, I2, I3> provide4(Out1<I4> and){ return (i1, i2, i3) -> in(i1, i2, i3, and.out1()); } static <I1, I2, I3, I4> In4<I1, I2, I3, I4> in4(In4<I1, I2, I3, I4> of) { return of; } static <I1, I2, I3, I4> In4<I1, I2, I3, I4> in4(In3<I1, I2, I3> in123, In1<I4> in4) { return (i1, i2, i3, i4) -> { in123.in(i1, i2, i3); in4.in(i4); }; } static <I1, I2, I3, I4> In4<I1, I2, I3, I4> in4(In2<I1, I2> in12, In2<I3, I4> in34) { return (i1, i2, i3, i4) -> { in12.in(i1, i2); in34.in(i3, i4); }; } static <I1, I2, I3, I4> In4<I1, I2, I3, I4> in4(In1<I1> in1, In3<I2, I3, I4> in234) { return (i1, i2, i3, i4) -> { in1.in(i1); in234.in(i2, i3, i4); }; } /** * 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 #in4(In4)}, as try/catch can disable / weaken some JIT compilers. */ static <I1, I2, I3, I4> In4<I1, I2, I3, I4> in4Unsafe(In4Unsafe<I1, I2, I3, I4> of) { return of; } interface In4Unsafe <I1, I2, I3, I4> extends In4<I1, I2, I3, I4> { void inUnsafe(I1 in1, I2 in2, I3 in3, I4 in4) throws Throwable; default void in(I1 in1, I2 in2, I3 in3, I4 in4) { try { inUnsafe(in1, in2, in3, in4); } catch (Throwable e) { throw rethrow(e); } } } }