package fase16.adder; import static fase16.adder.Adder.Adder.Adder.Add; import static fase16.adder.Adder.Adder.Adder.Bye; import static fase16.adder.Adder.Adder.Adder.C; import static fase16.adder.Adder.Adder.Adder.Res; import static fase16.adder.Adder.Adder.Adder.S; import org.scribble.net.Buf; import org.scribble.net.ObjectStreamFormatter; import org.scribble.net.session.MPSTEndpoint; import org.scribble.net.session.SocketChannelEndpoint; import fase16.adder.Adder.Adder.Adder; import fase16.adder.Adder.Adder.channels.C.Adder_C_1; import fase16.adder.Adder.Adder.channels.C.Adder_C_3; import fase16.adder.Adder.Adder.roles.C; public class AdderC { private static final int N = 10; public static void main(String[] args) throws Exception { //adder(); fib(); } private static void adder() throws Exception { Adder adder = new Adder(); try (MPSTEndpoint<Adder, C> se = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); Buf<Integer> i = new Buf<>(1); //* for (int j = 0; j < N; j++) { s1 = s1.send(S, Add, i.val, i.val).receive(S, Res, i); } s1.send(S, Bye).receive(S, Bye); /*/ s1.send(S, Add, i.val, i.val) .receive(S, Res, i) .send(S, Add, i.val, i.val) .receive(S, Res, i) //... .send(S, Bye).receive(S, Bye); //*/ System.out.println("C: " + i.val); } } private static void fib() throws Exception { Adder adder = new Adder(); try (MPSTEndpoint<Adder, C> se = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { se.connect(S, SocketChannelEndpoint::new, "localhost", 8888); Adder_C_1 s1 = new Adder_C_1(se); Buf<Integer> i = new Buf<>(0); fib(s1, i, new Buf<Integer>(1), 0).receive(S, Bye); System.out.println("Fib: " + i.val); } } private static Adder_C_3 fib(Adder_C_1 s1, Buf<Integer> i1, Buf<Integer> i2, int i) throws Exception { return (i < N) ? fib(s1.send(S, Add, i1.val, i1.val=i2.val).receive(S, Res, i2), i1, i2, i+1) : s1.send(S, Bye); } }