blob: 2c208804974b374bdce794b823a4d2e56f32d853 [file] [log] [blame]
use std::collections::VecDeque;
pub trait Worker: Sized {
type Event;
fn handle_event<P: FnMut(Self::Event)>(&mut self, push: P, event: Self::Event);
}
pub struct WorkQueue<W: Worker> {
worker: W,
queue: VecDeque<W::Event>,
}
impl<W: Worker> WorkQueue<W> {
pub fn new(worker: W) -> WorkQueue<W> {
WorkQueue {
worker,
queue: VecDeque::new(),
}
}
pub fn push_event(&mut self, event: W::Event) {
self.queue.push_back(event);
}
pub fn run(&mut self) {
while let Some(event) = self.queue.pop_front() {
let queue = &mut self.queue;
let push = |event| queue.push_back(event);
self.worker.handle_event(push, event);
}
}
}