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 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
//! This module contains the required definitions and
//! functions for the dual of the basic role A.
use crate::role::a::RoleA;
use crate::role::Role;
use crossbeam_channel::{bounded, Sender};
/// Gives the order to the
/// [`MeshedChannels`] related to
/// the `Dual` of A.
///
/// This `struct` should only be used in the `stack` field
/// of the [`MeshedChannels`] related
/// to the `Dual` of A.
///
/// [`MeshedChannels`]: crate::meshedchannels::MeshedChannels
///
/// # Example
///
/// ```
/// use mpstthree::role::a_dual::RoleADual;
/// use mpstthree::role::end::RoleEnd;
/// use mpstthree::role::Role; // Only used for example
///
/// type StackADual = RoleADual<RoleEnd>;
///
/// let _ = StackADual::new(); // Only used for example
/// ```
#[derive(Debug)]
pub struct RoleADual<R>
where
R: Role,
R::Dual: Role,
{
#[doc(hidden)]
pub sender: Sender<R::Dual>,
}
impl<R: Role> Role for RoleADual<R> {
type Dual = RoleA<R::Dual>;
fn new() -> (Self, Self::Dual) {
let (sender_normal, _) = bounded::<R>(1);
let (sender_dual, _) = bounded::<R::Dual>(1);
(
RoleADual {
sender: sender_dual,
},
RoleA {
sender: sender_normal,
},
)
}
fn head_str() -> String {
"RoleADual".to_string()
}
fn tail_str() -> String {
format!("{}<{}>", R::head_str(), R::tail_str())
}
fn self_head_str(&self) -> String {
"RoleADual".to_string()
}
fn self_tail_str(&self) -> String {
format!("{}<{}>", R::head_str(), R::tail_str())
}
}
impl<R: Role> RoleADual<R> {
/// Return the continuation for RoleADual
pub fn continuation(&self) -> R {
let (here, there) = R::new();
self.sender.send(there).unwrap_or(());
here
}
}