package tutorial.adder; import static tutorial.adder.Adder.Adder.Adder.Add; import static tutorial.adder.Adder.Adder.Adder.Bye; import static tutorial.adder.Adder.Adder.Adder.C; import static tutorial.adder.Adder.Adder.Adder.Res; import static tutorial.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 tutorial.adder.Adder.Adder.Adder; import tutorial.adder.Adder.Adder.channels.C.Adder_C_1; import tutorial.adder.Adder.Adder.channels.C.Adder_C_2; import tutorial.adder.Adder.Adder.roles.C; public class AdderC { public static void main(String[] args) throws Exception { Adder adder = new Adder(); try (MPSTEndpoint<Adder, C> client = new MPSTEndpoint<>(adder, C, new ObjectStreamFormatter())) { client.connect(S, SocketChannelEndpoint::new, "localhost", 8888); int n = 10; System.out.println(n + "th Fibonacci number: " + fibo(new Adder_C_1(client), n)); } } private static int fibo(Adder_C_1 c1, int n) throws Exception { Buf<Integer> x = new Buf<>(0); Buf<Integer> y = new Buf<>(1); Buf<Integer> i = new Buf<>(1); while (i.val < n) { Adder_C_2 c2 = c1.send(S, Add, x.val, y.val); x.val = y.val; c1 = c2.receive(S, Res, y); c1 = add1(c1, i); } c1.send(S, Bye); return x.val; } private static Adder_C_1 add1(Adder_C_1 c1, Buf<Integer> i) throws Exception { return c1.send(S, Add, i.val, 1).receive(S, Res, i); } }