mod channel;
pub mod handler;
mod queue;
use std::{any::TypeId, collections::HashMap};
use super::world::UnsafeWorldCell;
use channel::{EventChannel, ErasedEventChannel};
use handler::into::IntoEventHandler;
use queue::{EventQueue, ErasedEventQueue};
#[derive(Default)]
pub struct Events {
handlers: HashMap<TypeId, Box<dyn ErasedEventChannel>>,
}
impl Events {
pub fn register<E, H, P>(&mut self, handler: H)
where
E: 'static,
H: IntoEventHandler<E, P> + 'static,
P: 'static,
{
let id = TypeId::of::<E>();
self.handlers
.entry(id)
.or_insert(EventChannel::<E>::new_box())
.as_any_mut()
.downcast_mut::<EventChannel<E>>()
.map(|c| c.register(handler.into_handler()));
}
pub fn consume(&self, cell: &UnsafeWorldCell) {
let world = cell.get_mut();
let queues = world.events_mut();
queues
.iter_mut()
.for_each(|(id, queue)| {
self.handlers
.get(id)
.map(|h| h.trigger_all(queue.as_mut(), cell));
});
}
}
#[derive(Default)]
pub struct EventQueues {
queues: HashMap<TypeId, Box<dyn ErasedEventQueue>>,
}
impl EventQueues {
pub fn queue<E>(&mut self, event: E)
where
E: 'static,
{
let id = TypeId::of::<E>();
self.queues
.entry(id)
.or_insert(EventQueue::<E>::new_box())
.as_any_mut()
.downcast_mut::<EventQueue<E>>()
.map(|q| q.queue(event));
}
pub fn iter_mut(&mut self) -> impl Iterator<Item = (&TypeId, &mut Box<dyn ErasedEventQueue>)> {
self.queues.iter_mut()
}
}