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>; fn 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}