use std::hash::{DefaultHasher, Hash, Hasher};
#[derive(Eq, PartialEq, Debug, Copy, Clone)]
pub struct EventKind(u64);
pub trait Event {
fn event_name(&self) -> &str;
}
pub trait EventExt {
fn event_type(&self) -> EventKind;
}
impl<E: Event + ?Sized> EventExt for E {
#[inline]
fn event_type(&self) -> EventKind {
let mut hasher = DefaultHasher::new();
self.event_name().hash(&mut hasher);
EventKind(hasher.finish())
}
}
pub trait EventType {}
pub trait EventTypeExt {
#[inline]
fn static_event_name() -> &'static str {
std::any::type_name::<Self>()
}
#[inline]
fn static_event_type() -> EventKind {
let mut hasher = DefaultHasher::new();
std::any::type_name::<Self>().hash(&mut hasher);
EventKind(hasher.finish())
}
}
impl EventType for () {}
#[derive(Clone)]
pub struct UnitEventPump;
impl Iterator for UnitEventPump {
type Item = &'static dyn Event;
#[inline]
fn next(&mut self) -> Option<Self::Item> {
Some(&())
}
}
impl<E: EventType> EventTypeExt for E {}
impl<E: EventType> Event for E {
#[inline]
fn event_name(&self) -> &str {
E::static_event_name()
}
}