generic_session_types/
session.rs

1use std::marker::PhantomData;
2
3pub struct Close;
4pub struct IntoRaw;
5pub struct Recv<T, P>(PhantomData<(T, P)>);
6pub struct Send<T, P>(PhantomData<(T, P)>);
7pub struct Choose<P, Q>(PhantomData<(P, Q)>);
8pub struct Offer<P, Q>(PhantomData<(P, Q)>);
9pub struct Rec<P>(PhantomData<P>);
10pub struct Var<N>(PhantomData<N>);
11pub struct Z;
12pub struct S<N>(PhantomData<N>);
13
14pub trait HasDual {
15    type Dual: HasDual;
16}
17
18impl HasDual for Close {
19    type Dual = Close;
20}
21
22impl HasDual for IntoRaw {
23    type Dual = IntoRaw;
24}
25
26impl<T, P: HasDual> HasDual for Recv<T, P> {
27    type Dual = Send<T, P::Dual>;
28}
29
30impl<T, P: HasDual> HasDual for Send<T, P> {
31    type Dual = Recv<T, P::Dual>;
32}
33
34impl<P: HasDual, Q: HasDual> HasDual for Choose<P, Q> {
35    type Dual = Offer<P::Dual, Q::Dual>;
36}
37
38impl<P: HasDual, Q: HasDual> HasDual for Offer<P, Q> {
39    type Dual = Choose<P::Dual, Q::Dual>;
40}
41
42impl HasDual for Var<Z> {
43    type Dual = Var<Z>;
44}
45
46impl<N> HasDual for Var<S<N>> {
47    type Dual = Var<S<N>>;
48}
49
50impl<P: HasDual> HasDual for Rec<P> {
51    type Dual = Rec<P::Dual>;
52}