//$ bin/scribblec.sh modules/core/src/test/scrib/demo/fib/Fib.scr -ip modules/core/src/test/scrib/ -d modules/core/src/test/scrib/ -api Fibonacci A -api Fibonacci B
package fib;
import java.io.IOException;
import org.scribble.main.ScribbleRuntimeException;
import org.scribble.net.Buf;
import org.scribble.net.ObjectStreamFormatter;
import org.scribble.net.scribsock.ScribServerSocket;
import org.scribble.net.scribsock.SocketChannelServer;
import org.scribble.net.session.MPSTEndpoint;
import org.scribble.net.session.SocketChannelEndpoint;
import fib.Fib.Fibonacci.Fibonacci;
import fib.Fib.Fibonacci.channels.A.Fibonacci_A_1;
import fib.Fib.Fibonacci.channels.B.EndSocket;
import fib.Fib.Fibonacci.channels.B.Fibonacci_B_1;
import fib.Fib.Fibonacci.channels.B.Fibonacci_B_1_Handler;
import fib.Fib.Fibonacci.channels.B.Fibonacci_B_2;
import fib.Fib.Fibonacci.ops.end;
import fib.Fib.Fibonacci.ops.fibonacci;
import fib.Fib.Fibonacci.roles.A;
import fib.Fib.Fibonacci.roles.B;
public class Fibo
{
public static void main(String[] args) throws Exception
{
Fibonacci fib = new Fibonacci();
new MyB(fib).start();
new MyA(fib).start();
}
}
class MyB extends Thread implements Fibonacci_B_1_Handler
{
private final Fibonacci fib;
private long x = 1;
public MyB(Fibonacci fib)
{
this.fib = fib;
}
@Override
public void run()
{
try (
ScribServerSocket ss = new SocketChannelServer(8888);
MPSTEndpoint<Fibonacci, B> se = new MPSTEndpoint<>(this.fib, Fibonacci.B, new ObjectStreamFormatter()))
{
se.accept(ss, Fibonacci.A);
new Fibonacci_B_1(se).branch(Fibonacci.A, this);
}
catch (Exception x)
{
x.printStackTrace();
}
}
@Override
public void receive(Fibonacci_B_2 s, fibonacci op, Buf<Long> arg1) throws ScribbleRuntimeException, IOException, ClassNotFoundException
{
s.send(Fibonacci.A, Fibonacci.fibonacci, (this.x += arg1.val)).branch(Fibonacci.A, this);
}
@Override
public void receive(EndSocket schan, end op) throws ScribbleRuntimeException, IOException, ClassNotFoundException
{
//System.out.println("B done: " + this.x);
}
}
class MyA extends Thread
{
private final Fibonacci fib;
private Buf<Long> b = new Buf<>(0L);
public MyA(Fibonacci fib)
{
this.fib = fib;
}
@Override
public void run()
{
try (MPSTEndpoint<Fibonacci, A> se = new MPSTEndpoint<>(this.fib, Fibonacci.A, new ObjectStreamFormatter()))
{
se.connect(Fibonacci.B, SocketChannelEndpoint::new, "localhost", 8888);
run(new Fibonacci_A_1(se), 19); // 4184
System.out.println("A done: " + this.b.val);
}
catch (Exception x)
{
x.printStackTrace();
}
}
private fib.Fib.Fibonacci.channels.A.EndSocket run(Fibonacci_A_1 s, int todo) throws Exception
{
return (todo > 0)
? run(
next(this.b.val,
s.send(Fibonacci.B, Fibonacci.fibonacci, this.b.val)
.receive(Fibonacci.B, Fibonacci.fibonacci, this.b), todo),
todo - 2)
: s.send(Fibonacci.B, Fibonacci.end);
}
private Fibonacci_A_1 next(long prev, Fibonacci_A_1 s, int todo)
{
//System.out.println("A: " + prev);
if (todo > 1)
this.b.val += prev;
return s;
}
}