package coco.fibo;
import static coco.fibo.Fibo.Fibonacci.Fibonacci.A;
import static coco.fibo.Fibo.Fibonacci.Fibonacci.B;
import static coco.fibo.Fibo.Fibonacci.Fibonacci.fibonacci;
import static coco.fibo.Fibo.Fibonacci.Fibonacci.stop;
import org.scribble.net.Buf;
import org.scribble.net.ObjectStreamFormatter;
import org.scribble.net.session.MPSTEndpoint;
import org.scribble.net.session.SocketChannelEndpoint;
import coco.fibo.Fibo.Fibonacci.Fibonacci;
import coco.fibo.Fibo.Fibonacci.channels.A.EndSocket;
import coco.fibo.Fibo.Fibonacci.channels.A.Fibonacci_A_1;
import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.In_B_fibonacci_Long;
import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Out_B_fibonacci_Long;
import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Out_B_stop;
import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Succ_In_B_fibonacci_Long;
import coco.fibo.Fibo.Fibonacci.channels.A.ioifaces.Succ_Out_B_fibonacci_Long;
import coco.fibo.Fibo.Fibonacci.roles.A;
public class FiboA extends Thread
{
private final Fibonacci fib;
private Buf<Long> b = new Buf<>(0L);
public FiboA(Fibonacci fib)
{
this.fib = fib;
}
@Override
public void run()
{
int n = 19;
try (MPSTEndpoint<Fibonacci, A> se = new MPSTEndpoint<>(this.fib, A, new ObjectStreamFormatter()))
{
se.connect(B, SocketChannelEndpoint::new, "localhost", 8888);
run(new Fibonacci_A_1(se), n); // 4184
System.out.println("A #" + n + ": " + this.b.val);
}
catch (Exception x)
{
x.printStackTrace();
}
}
private EndSocket run(Fibonacci_A_1 s, int todo) throws Exception
{
return run1(s, todo);
}
private
<
//*/
T1 extends
Out_B_fibonacci_Long<T2> & Out_B_stop<EndSocket> // Action I/f's
& Succ_In_B_fibonacci_Long, // Successor I/f's
T2 extends
In_B_fibonacci_Long<T1>
& Succ_Out_B_fibonacci_Long //, E extends Succ_Out_B_stop
/*/
T1 extends Select_A_B_fibonacci_Long__B_stop<T2, EndSocket>,
T2 extends Receive_A_B_fibonacci_Long<T1>
//*/
>
EndSocket run1(T1 s, int todo) throws Exception
{
return (todo > 0)
? run1(
next(this.b.val,
s.send(B, fibonacci, this.b.val)
.receive(B, fibonacci, this.b), todo),
todo - 2)
: s.send(Fibonacci.B, stop);
}
//private Fibonacci_A_1 next(long prev, Fibonacci_A_1 s, int todo)
private <S> S next(long prev, S s, int todo)
{
//System.out.println("A: " + prev);
if (todo > 1)
this.b.val += prev;
return s;
}
}