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
use crossbeam::channel; pub enum KillMode { Sync, Async, } impl KillMode { fn into_channel<T>(self) -> (channel::Sender<T>, channel::Receiver<T>) { match self { KillMode::Sync => channel::bounded(0), KillMode::Async => channel::unbounded(), } } } #[derive(Clone)] pub struct Sender { pub kill_tx: channel::Sender<()>, } impl Sender { pub fn send(&self) -> Result<(), channel::SendError<()>> { self.kill_tx.send(()) } } pub struct Receiver { pub kill_rx: channel::Receiver<()>, } impl Receiver { pub fn try_recv(&self) -> Result<(), channel::TryRecvError> { self.kill_rx.try_recv() } } pub fn channel(kill_mode: KillMode) -> (Sender, Receiver) { let (kill_tx, kill_rx) = kill_mode.into_channel(); (Sender { kill_tx }, Receiver { kill_rx }) }