pollination 0.1.0

An experimental library exposing hybrid Raft and CRDT primitives.
Documentation
#![allow(unused)]
use tokio::sync::mpsc::{Receiver, Sender, channel, error::SendError};

pub struct WalkieTalkie<T, U = T> {
    tx: Sender<T>,
    rx: Receiver<U>,
}

impl<T, U> WalkieTalkie<T, U> {
    pub fn pair() -> (WalkieTalkie<T, U>, WalkieTalkie<U, T>) {
        let (tx0, rx0): (Sender<T>, Receiver<T>) = channel(1);
        let (tx1, rx1): (Sender<U>, Receiver<U>) = channel(1);

        (
            WalkieTalkie { tx: tx0, rx: rx1 },
            WalkieTalkie { tx: tx1, rx: rx0 },
        )
    }

    pub fn pair_with_buffer(buffer: usize) -> (WalkieTalkie<T, U>, WalkieTalkie<U, T>) {
        let (tx0, rx0): (Sender<T>, Receiver<T>) = channel(buffer);
        let (tx1, rx1): (Sender<U>, Receiver<U>) = channel(buffer);

        (
            WalkieTalkie { tx: tx0, rx: rx1 },
            WalkieTalkie { tx: tx1, rx: rx0 },
        )
    }

    pub async fn send_recv(&mut self, value: T) -> Option<U> {
        self.send(value).await.ok()?;
        self.recv().await
    }

    pub async fn send(&self, value: T) -> Result<(), SendError<T>> {
        self.tx.send(value).await
    }

    pub async fn recv(&mut self) -> Option<U> {
        self.rx.recv().await
    }

    pub fn split(self) -> (Sender<T>, Receiver<U>) {
        (self.tx, self.rx)
    }
}