1use std::any::TypeId;
4use std::collections::HashMap;
5use std::sync::{Arc, Mutex};
6
7use crate::events::Event;
8
9type EventCallback = Box<dyn Fn(&dyn Event) + Send + Sync>;
11
12#[derive(Clone)]
14pub struct EventEmitter {
15 handlers: Arc<Mutex<HashMap<TypeId, Vec<Arc<EventCallback>>>>>,
17}
18
19impl std::fmt::Debug for EventEmitter {
20 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
21 f.debug_struct("EventEmitter")
22 .field("handlers", &"[EventHandlers]")
23 .finish()
24 }
25}
26
27impl EventEmitter {
28 pub fn new() -> Self {
30 Self {
31 handlers: Arc::new(Mutex::new(HashMap::new())),
32 }
33 }
34
35 pub fn on<E: Event + 'static>(
37 &mut self,
38 handler: impl Fn(&E) + Send + Sync + 'static,
39 ) -> Result<(), String> {
40 let type_id = TypeId::of::<E>();
41
42 let callback: EventCallback = Box::new(move |event| {
43 if let Some(typed_event) = event.as_any().downcast_ref::<E>() {
44 handler(typed_event);
45 }
46 });
47 let mut handlers = self
48 .handlers
49 .lock()
50 .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
51
52 handlers
53 .entry(type_id)
54 .or_insert_with(Vec::new)
55 .push(Arc::new(callback));
56
57 Ok(())
58 }
59
60 pub fn emit<E: Event>(&self, event: &E) -> Result<(), String> {
62 let type_id = TypeId::of::<E>();
63 let handlers = self
64 .handlers
65 .lock()
66 .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
67
68 if let Some(handlers) = handlers.get(&type_id) {
69 for handler in handlers {
70 handler(event);
71 }
72 }
73 Ok(())
74 }
75
76 pub fn clear(&mut self) -> Result<(), String> {
78 let mut handlers = self
79 .handlers
80 .lock()
81 .map_err(|e| format!("Failed to lock event handlers: {e}"))?;
82 handlers.clear();
83 Ok(())
84 }
85}
86
87impl Default for EventEmitter {
88 fn default() -> Self {
89 Self::new()
90 }
91}