sequencing/
sequencing.rs

1use par::{
2    exchange::{Recv, Send},
3    runtimes::tokio::fork,
4    Dual,
5};
6
7enum Op {
8    Plus,
9    Times,
10}
11
12type Calculator = Send<i64, Send<Op, Send<i64, Recv<i64>>>>;
13type User = Dual<Calculator>; // Recv<i64, Recv<Op, Recv<i64, Send<i64>>>>
14
15fn start_calculator() -> Calculator {
16    fork(|user: User| async {
17        let (x, user) = user.recv().await;
18        let (op, user) = user.recv().await;
19        let (y, user) = user.recv().await;
20        let result = match op {
21            Op::Plus => x + y,
22            Op::Times => x * y,
23        };
24        user.send1(result);
25    })
26}
27
28#[tokio::main]
29async fn main() {
30    let sum = start_calculator()
31        .send(3)
32        .send(Op::Plus)
33        .send(4)
34        .recv1()
35        .await;
36
37    let product = start_calculator()
38        .send(3)
39        .send(Op::Times)
40        .send(4)
41        .recv1()
42        .await;
43
44    assert_eq!(sum, 7);
45    assert_eq!(product, 12);
46}