use std::time::{Duration, Instant}; use anyhow::Result; pub struct Sender { tx: crossbeam_channel::Sender<(T, crossbeam_channel::Receiver)>, } impl Clone for Sender { fn clone(&self) -> Self { Self { tx: self.tx.clone(), } } } impl Sender where T: Send + Sync + 'static, { pub fn send(&self, msg: T, delay: Duration) -> Result<()> { self.tx.send((msg, crossbeam_channel::after(delay)))?; Ok(()) } } pub struct Receiver { rx: crossbeam_channel::Receiver<(T, crossbeam_channel::Receiver)>, } impl Clone for Receiver { fn clone(&self) -> Self { Self { rx: self.rx.clone(), } } } impl Receiver { pub fn recv(&self) -> Result { let (mut last_msg, delay) = self.rx.recv()?; delay.recv()?; while let Ok((msg, delay)) = self.rx.try_recv() { delay.recv()?; last_msg = msg; } Ok(last_msg) } } pub fn unbounded() -> (Sender, Receiver) { let (tx, rx) = crossbeam_channel::unbounded(); (Sender { tx }, Receiver { rx }) }