Client for Shared Channels
Acquire Shared Session
fn acquire_shared_session<N, C1, C2, A1, A2, B>(
shared: SharedChannel<LinearToShared<A1>>,
cont: impl FnOnce(N) -> PartialSession<C2, B>,
) -> PartialSession<C1, B>
Example
Consider an equi-recursive definition
S = LinearToShared<SendValue<u64, SharedToLinear<S>>>
A1
=SendValue<u64, Release>
C1
=HList![…]
N
is the length ofC1
.-
C2 = HList![…, N: SendValue<u64, LinearToShared< SharedToLinear< SendValue<u64, Release> >>]
Release Shared Session
fn release_shared_session<N, C1, C2, A, B>(
n: N,
cont: PartialSession<C2, B>,
) -> PartialSession<C1, B>
Example
Consider an equi-recursive definition
S = LinearToShared<SendValue<u64, SharedToLinear<S>>>
A1
=SendValue<u64, Release>
-
C1 = HList![…, N: LinearToShared< SharedToLinear< SendValue<u64, Release> >>, …]
C2
=HList![…, N: Empty, …]
Example Client
fn shared_counter_client(
counter: SharedChannel<LinearToShared<SendValue<u64, Release>>>
) -> Session<End>
{
acquire_shared_session(counter, move |c| {
receive_value_from(c, move |x| {
println!("{}", x);
release_shared_session(c, terminate())
})
})
}