use super::StreamBuilder;
use crate::context::Receiver;
use crate::messages::Message;
use tokio::sync::mpsc;
impl<T: Message + Send + 'static> StreamBuilder<T> {
pub fn zip<U>(self, other: Receiver<U>) -> Receiver<(T, U)>
where
U: Message + Send + 'static,
{
let (tx, rx) = mpsc::unbounded_channel();
tokio::spawn(async move {
Self::run_zip_pipeline(self.receiver, other, tx).await;
});
Receiver::from(rx)
}
async fn run_zip_pipeline<U>(
mut receiver1: Receiver<T>,
mut receiver2: Receiver<U>,
tx: mpsc::UnboundedSender<(T, U)>,
) where
U: Message + Send + 'static,
{
loop {
let msg1 = receiver1.recv().await;
let msg2 = receiver2.recv().await;
match (msg1, msg2) {
(Some(m1), Some(m2)) => {
if tx.send((m1, m2)).is_err() {
break;
}
}
_ => {
break;
}
}
}
}
}