public void ContinuationPassingTest() { var client = BinarySessionChannel <Request <int, Respond <double, Close> > > .Fork ( server => { server.Receive((s1, v) => s1.Send(Math.Sqrt(v), s2 => s2.Close())); } ); double result = default; client.Send (10, c1 => { c1.Receive( (c2, v) => { result = v; c2.Close(); } ); } ); Assert.Equal(Math.Sqrt(10), result); }
/// <summary> /// 分岐・再帰のある通信 /// サーバーはクライアントから整数を受け取り対応するFizzBuzzゲームの回答を返す /// クライアントが満足するまで繰り返す /// </summary> private static async Task Example3(int n) { var client = BinarySessionChannel <Cons <Request <int, Respond <string, RequestChoice <Jump <Zero>, Close> > >, Nil> > .Fork(async server => { // サーバースレッドの処理 var s1 = server.Enter(); while (true) { var(s2, i) = await s1.ReceiveAsync(); var str = Mod(i, 3) == 0 ? (Mod(i, 5) == 0 ? "FizzBuzz" : "Fizz") : (Mod(i, 5) == 0 ? "Buzz" : $"{i}"); var s3 = s2.Send(str); bool l = false; await s3.FollowAsync( left => { l = true; s1 = left.Zero(); // TODO 本当はここからループはじめに飛びたい }, right => { }); // TODO if (!l) { break; } } }); // クライアント側の処理 int j = 1; var c1 = client.Enter(); while (true) { var c2 = c1.Send(j); var(c3, s) = await c2.ReceiveAsync(); Console.WriteLine(s); if (j == n) { c3.ChooseRight(); break; } c1 = c3.ChooseLeft().Zero(); j++; } }