use std::sync::{Arc, Mutex}; use std::collections::VecDeque; pub fn event_queue() -> (EventSender, EventReceiver) { let sender = EventSender { queue: Arc::new(Mutex::new(VecDeque::new())), }; let receiver = EventReceiver { queue: sender.queue.clone(), }; (sender, receiver) } #[derive(Clone)] pub struct EventSender { queue: Arc>>, } impl EventSender { pub fn send(&self, event: T) { self.queue.lock().unwrap().push_back(event); } } pub struct EventReceiver { queue: Arc>>, } impl EventReceiver { pub fn receive(&self) -> Option { self.queue.lock().unwrap().pop_front() } }