use std::collections::VecDeque; pub struct EventQueue { queue: VecDeque, } impl EventQueue { pub const fn new() -> Self { Self { queue: VecDeque::new() } } pub fn read(&mut self) -> Option { self.queue.pop_front() } pub fn write(&mut self, event: E) { self.queue.push_back(event); } pub fn drain(&mut self) -> Vec { self.queue.drain(..).collect() } pub fn as_reader(&mut self) -> EventReader { EventReader { queue: &mut self.queue } } pub fn as_writer(&mut self) -> EventWriter { EventWriter { queue: &mut self.queue } } } impl Iterator for EventQueue { type Item = E; fn next(&mut self) -> Option { self.read() } } pub struct EventReader<'q, E> { queue: &'q mut VecDeque, } impl EventReader<'_, E> { pub fn read(&mut self) -> Option { self.queue.pop_front() } } pub struct EventWriter<'q, E> { queue: &'q mut VecDeque, } impl EventWriter<'_, E> { pub fn write(&mut self, event: E) { self.queue.push_front(event) } } impl Iterator for EventReader<'_, E> { type Item = E; fn next(&mut self) -> Option { self.read() } }