1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
use ferrite_session::{
  either::*,
  prelude::*,
};

pub fn internal_choice_session() -> Session<End>
{
  let client: Session<
    ReceiveChannel<
      InternalChoice<Either<SendValue<String, End>, ReceiveValue<u64, End>>>,
      End,
    >,
  > = receive_channel(|chan| {
    case! { chan ;
      Left => {
        receive_value_from ( chan,
          move |val: String| {
            println! ("received string: {}", val);
            wait ( chan,
              terminate () )
          })
      }
      Right => {
        send_value_to ( chan,
          42,
          wait ( chan,
            terminate () ) )
      }
    }
  });

  let provider_left: Session<
    InternalChoice<Either<SendValue<String, End>, ReceiveValue<u64, End>>>,
  > = offer_case!(Left, send_value("provider_left".to_string(), terminate()));

  let _provider_right: Session<
    InternalChoice<Either<SendValue<String, End>, ReceiveValue<u64, End>>>,
  > = offer_case!(
    Right,
    receive_value(|val: u64| {
      println!("received int: {}", val);
      terminate()
    })
  );

  apply_channel(client, provider_left)
}

#[tokio::main]
pub async fn main()
{
  run_session(internal_choice_session()).await
}