package xapi.fu; import static xapi.fu.Immutable.immutable1; /** * @author James X. Nelson (james@wetheinter.net) * Created on 07/11/15. */ @SuppressWarnings("unchecked") public interface Out3<O1, O2, O3> extends OutMany { default O1 out1() { return out1Provider().out1(); } default O2 out2() { return out2Provider().out1(); } default O3 out3() { return out3Provider().out1(); } default Out1<O1> out1Provider() { return (Out1<O1>) out0()[0]; } default Out1<O2> out2Provider() { return (Out1<O2>) out0()[1]; } default Out1<O3> out3Provider() { return (Out1<O3>) out0()[2]; } default Out3<O1, O2, O3> use1(In1<O1> callback) { callback.in(out1()); return this; } default Out3<O1, O2, O3> use2(In1<O2> callback) { callback.in(out2()); return this; } default Out3<O1, O2, O3> use3(In1<O3> callback) { callback.in(out3()); return this; } /** * @return an immutable copy of this object. */ default <F extends Out3<O1, O2, O3> & Frozen> F freeze() { if (this instanceof Frozen) { return (F) this; } final Out1[] outs = out0(); outs[0] = outs[0].freeze(); outs[1] = outs[1].freeze(); outs[2] = outs[2].freeze(); F f = (F)(Out3<O1, O2, O3> & Frozen)()->outs; return f; } static <O1, O2, O3> Out3<O1, O2, O3> out3(Out1<O1> o1, Out1<O2> o2, Out1<O3> o3) { final Out1[] out = new Out1[]{o1, o2, o3}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(Out1<O1> o1, O2 o2, O3 o3) { final Out1[] out = new Out1[]{o1, immutable1(o2), immutable1(o3)}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(O1 o1, Out1<O2> o2, O3 o3) { final Out1[] out = new Out1[]{immutable1(o1), o2, immutable1(o3)}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(O1 o1, O2 o2, Out1<O3> o3) { final Out1[] out = new Out1[]{immutable1(o1), immutable1(o2), o3}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(O1 o1, Out1<O2> o2, Out1<O3> o3) { final Out1[] out = new Out1[]{immutable1(o1), o2, o3}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(Out1<O1> o1, O2 o2, Out1<O3> o3) { final Out1[] out = new Out1[]{o1, immutable1(o2), o3}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(Out1<O1> o1, Out1<O2> o2, O3 o3) { final Out1[] out = new Out1[]{o1, o2, immutable1(o3)}; return ()->out; } static <O1, O2, O3> Out3<O1, O2, O3> out3(O1 o1, O2 o2, O3 o3) { final Out1[] out = new Out1[]{immutable1(o1), immutable1(o2), immutable1(o3)}; return ()->out; } }