use std::collections::VecDeque;
use super::events::EngineEvent;
use super::handler::{EngineContext, EventHandler};
pub struct EventPump;
impl EventPump {
pub fn run(handlers: &[Box<dyn EventHandler>], initial: EngineEvent, ctx: &mut EngineContext) {
let mut queue: VecDeque<EngineEvent> = VecDeque::new();
queue.push_back(initial);
while let Some(event) = queue.pop_front() {
let run_in_tx = ctx.run_in_tx.take();
if let Some(mut run_in_tx) = run_in_tx {
run_in_tx(&event, handlers, ctx, &mut queue);
ctx.run_in_tx = Some(run_in_tx);
} else {
for handler in handlers {
let new_events = handler.handle(&event, ctx);
queue.extend(new_events);
}
}
}
}
}