use crate::binary::cancel::cancel;
use crate::binary::recv::recv;
use crate::binary::struct_trait::{end::End, recv::Recv, session::Session};
use either::Either;
use std::error::Error;
pub type Offer<S1, S2> = Recv<Either<S1, S2>, End>;
pub fn offer_either<'a, S1, S2, F, G, R>(
s: Offer<S1, S2>,
f: F,
g: G,
) -> Result<R, Box<dyn Error + 'a>>
where
S1: Session,
S2: Session,
F: FnOnce(S1) -> Result<R, Box<dyn Error + 'a>>,
G: FnOnce(S2) -> Result<R, Box<dyn Error + 'a>>,
{
let (e, s) = recv(s)?;
cancel(s);
e.either(f, g)
}
#[macro_export]
macro_rules! offer {
($session: expr, { $( $pat: pat => $result: expr , )+ }) => {
(move || -> Result<_, _> {
let (l, s) = mpstthree::binary::recv::recv($session)?;
mpstthree::binary::cancel::cancel(s);
match l {
$(
$pat => $result,
)+
_ => panic!("Unexpected payload") ,
}
})()
};
}