Skip to main content

ferrite_session/internal/session/
context.rs

1use crate::internal::{
2  base::{
3    unsafe_create_session,
4    unsafe_run_session,
5    AppendContext,
6    Empty,
7    EmptyContext,
8    PartialSession,
9    Protocol,
10    Session,
11    Slot,
12  },
13  functional::nat::{
14    Nat,
15    S,
16    Z,
17  },
18};
19
20pub fn new_session<A>(cont: Session<A>) -> Session<A>
21where
22  A: Protocol,
23{
24  cont
25}
26
27pub fn session<C, A>(cont: PartialSession<C, A>) -> Session<A>
28where
29  C: EmptyContext,
30  A: Protocol,
31{
32  unsafe_create_session(move |(), sender| async move {
33    let ctx = <C as EmptyContext>::empty_values();
34
35    unsafe_run_session(cont, ctx, sender).await;
36  })
37}
38
39pub fn partial_session<C, A>(cont: Session<A>) -> PartialSession<C, A>
40where
41  C: EmptyContext,
42  A: Protocol,
43{
44  unsafe_create_session(move |_, sender| async move {
45    unsafe_run_session(cont, (), sender).await
46  })
47}
48
49pub fn append_emtpy_slot<C, A>(
50  cont: PartialSession<C, A>
51) -> PartialSession<C::Appended, A>
52where
53  A: Protocol,
54  C: AppendContext<(Empty, ())>,
55{
56  unsafe_create_session(move |ctx1, sender| async move {
57    let (ctx2, _) = C::split_context(ctx1);
58    unsafe_run_session(cont, ctx2, sender).await
59  })
60}
61
62pub fn session_1<A>(
63  cont: impl FnOnce(Z) -> PartialSession<(Empty, ()), A>
64) -> Session<A>
65where
66  A: Protocol,
67{
68  session(cont(Z::Value))
69}
70
71pub fn session_2<A>(
72  cont: impl FnOnce(Z, S<Z>) -> PartialSession<(Empty, (Empty, ())), A>
73) -> Session<A>
74where
75  A: Protocol,
76{
77  session(cont(Z::Value, <S<Z>>::Value))
78}
79
80pub fn partial_session_1<A, B>(
81  cont: impl FnOnce(Z) -> PartialSession<(A, ()), B>
82) -> PartialSession<(A, ()), B>
83where
84  A: Slot,
85  B: Protocol,
86{
87  cont(Z::Value)
88}
89
90pub fn partial_session_2<A1, A2, B, F>(
91  cont: impl FnOnce(Z, S<Z>) -> PartialSession<(A1, (A2, ())), B>
92) -> PartialSession<(A1, (A2, ())), B>
93where
94  A1: Slot,
95  A2: Slot,
96  B: Protocol,
97{
98  cont(Z::Value, <S<Z>>::Value)
99}