use crossbeam_channel::{unbounded, Receiver, Sender, TryIter}; use cursive::{CbFunc, Cursive}; use spotify::PlayerState; pub enum Event { QueueUpdate, PlayState(PlayerState), } pub type EventSender = Sender; #[derive(Clone)] pub struct EventManager { tx: EventSender, rx: Receiver, cursive_sink: Sender>, } impl EventManager { pub fn new(cursive_sink: Sender>) -> EventManager { let (tx, rx) = unbounded(); EventManager { tx: tx, rx: rx, cursive_sink: cursive_sink, } } pub fn msg_iter(&self) -> TryIter { self.rx.try_iter() } pub fn send(&self, event: Event) { self.tx.send(event); self.trigger(); } pub fn trigger(&self) { // send a no-op to trigger event loop processing self.cursive_sink.send(Box::new(|_s: &mut Cursive| {})); } }