fn bichannel<Tx0, Rx0, Tx1, Rx1>(
        make0: impl FnOnce() -> (Tx0, Rx0),
        make1: impl FnOnce() -> (Tx1, Rx1),
    ) -> (Chan<Self, Tx0, Rx1>, Chan<Self::Dual, Tx1, Rx0>)
    where
        <Self as Session>::Dual: Scoped + Actionable + HasDual,
        Tx0: Send + 'static,
        Rx0: Send + 'static,
        Tx1: Send + 'static,
        Rx1: Send + 'static,
    {
        let (tx0, rx0) = make0();
        let (tx1, rx1) = make1();
        (Self::wrap(tx0, rx1), <Self::Dual>::wrap(tx1, rx0))
    }
/// Given two closures, each of which generates a uni-directional underlying transport channel,
/// create a pair of dual [`Chan`]s which communicate over the transport channels resulting from
/// these closures.
///
/// By internally wiring together the two directional channels, this function assures that
/// communications over the channels actually follow the session specified.
///
/// # Examples
///
/// ```
/// use dialectic::prelude::*;
/// use dialectic_tokio_mpsc as mpsc;
///
/// # #[tokio::main]
/// # async fn main() {
/// let (c1, c2) = <Session! { /* ... */ }>::bichannel(
///     mpsc::unbounded_channel,
///     || mpsc::channel(1),
/// );
/// # }
/// ```
Given two closures, each of which generates a uni-directional underlying transport channel,
create a pair of dual [`Chan`]s which communicate over the transport channels resulting from
these closures.

By internally wiring together the two directional channels, this function assures that
communications over the channels actually follow the session specified.
Given two closures each of which generates a uni - directional underlying transport channel create a pair of dual [ ` Chan ` ] s which communicate over the transport channels resulting from these closures . By internally wiring together the two directional channels this function assures that communications over the channels actually follow the session specified .
fn bichannel<Tx0, Rx0, Tx1, Rx1>(
        make0: impl FnOnce() -> (Tx0, Rx0),
        make1: impl FnOnce() -> (Tx1, Rx1),
    ) -> (Chan<Self, Tx0, Rx1>, Chan<Self::Dual, Tx1, Rx0>)
    where
        <Self as Session>::Dual: Scoped + Actionable + HasDual,
        Tx0: Send + 'static,
        Rx0: Send + 'static,
        Tx1: Send + 'static,
        Rx1: Send + 'static,
    {
        let (tx0, rx0) = make0();
        let (tx1, rx1) = make1();
        (Self::wrap(tx0, rx1), <Self::Dual>::wrap(tx1, rx0))
    }
fn bichannel < Tx0 , Rx0 , Tx1 , Rx1 > ( make0 : impl FnOnce ( ) -> ( Tx0 , Rx0 ) , make1 : impl FnOnce ( ) -> ( Tx1 , Rx1 ) , ) -> ( Chan < Self , Tx0 , Rx1 > , Chan < Self :: Dual , Tx1 , Rx0 > ) where < Self as Session > :: Dual : Scoped + Actionable + HasDual , Tx0 : Send + ' static , Rx0 : Send + ' static , Tx1 : Send + ' static , Rx1 : Send + ' static , { let ( tx0 , rx0 ) = make0 ( ) ; let ( tx1 , rx1 ) = make1 ( ) ; ( Self :: wrap ( tx0 , rx1 ) , < Self :: Dual > :: wrap ( tx1 , rx0 ) ) }
Given two closures, each of which generates a uni-directional underlying transport channel,
create a pair of dual [`Chan`]s which communicate over the transport channels resulting from
these closures.
Given two closures each of which generates a uni - directional underlying transport channel create a pair of dual [ ` Chan ` ] s which communicate over the transport channels resulting from these closures .
make0
impl FnOnce() -> (Tx0, Rx0)
make1
impl FnOnce() -> (Tx1, Rx1)
examples
```
use dialectic::prelude::*;
use dialectic_tokio_mpsc as mpsc.
` ` ` use dialectic :: prelude :: * ; use dialectic_tokio_mpsc as mpsc .
#[tokio::main]
None
async fn main() {
None
}
None