EventEmitter/
lib.rs

1use std::collections::HashMap;
2use std::sync::{Arc, Mutex};
3
4type EventCallback = Arc<dyn Fn() + Send + Sync>;
5
6pub struct EventEmitter {
7    _events: Mutex<HashMap<String, Vec<EventCallback>>>,
8    _max_listeners: usize,
9}
10
11impl EventEmitter {
12    /// Creates an EventEmitter instance
13    /// # Examples
14    /// ```
15    /// use std::sync::{Arc};
16    /// use EventEmitter::EventEmitter;
17    /// 
18    /// fn main() {
19    ///     let emitter = EventEmitter::new();
20    /// 
21    ///     let callback1 = Arc::new(|| println!("[event1 emitted]: The first callback of event1 has been called."));
22    ///     let callback2 = Arc::new(|| println!("[event1 emitted]: The second callback of event1 has been called."));
23    ///     let callback3 = Arc::new(|| println!("[event2 emitted]: The only one callbask of event2 has been called."));
24    /// 
25    ///     // Add event listener
26    ///     emitter.on("event1", callback1);
27    ///     emitter.add_listener("event1", callback2); // The `add_listene` method is an alias method for the `on` method.
28    ///     emitter.on("event2", callback3);
29    /// 
30    ///     let ct1 = emitter.listener_count("event1");
31    ///     let ct2 = emitter.listener_count("event2");
32    ///     println!("Number of Listeners for event1 is: {ct1}, \nNumber of Listeners for event2 is: {ct2}");
33    /// 
34    ///     emitter.emit("event1"); // Emit event1
35    ///     emitter.emit("event2"); // Emit event1
36    /// }
37    /// ```
38    /// 
39    pub fn new() -> Self {
40        EventEmitter {
41            _events: Mutex::new(HashMap::new()),
42            _max_listeners: usize::MAX,
43        }
44    }
45
46    /// 设置最大监听器数量
47    /// Set the maximum number of listeners
48    pub fn set_max_listeners(&mut self, max_listeners: usize) {
49        self._max_listeners = max_listeners;
50    }
51
52    /// 获取最大监听器数量
53    pub fn get_max_listeners(&self) -> usize {
54        self._max_listeners
55    }
56
57    /// 添加事件监听器
58    /// 
59    /// 是 `on` 方法的别名
60    /// 
61    /// Get the maximum number of listeners
62    /// 
63    /// alias method for the `on` method.
64    pub fn add_listener(&self, event: &str, callback: EventCallback) {
65        self.on(event, callback);
66    }
67
68    /// 添加事件监听器
69    /// Add event listener
70    pub fn on(&self, event: &str, callback: EventCallback) {
71        let mut events = self._events.lock().unwrap();
72        let callbacks = events.entry(event.to_string()).or_insert(Vec::new());
73        callbacks.push(callback);
74    }
75
76    /// 移除事件监听器
77    /// 
78    /// 是 `off` 方法的别名
79    /// 
80    /// Remove the event listener
81    /// 
82    /// alias method for the `off` method.
83    pub fn remove_listener(&self, event: &str, callback: &EventCallback) {
84        self.off(event, callback);
85    }
86
87    pub fn off(&self, event: &str, callback: &EventCallback) {
88        let mut events = self._events.lock().unwrap();
89        if let Some(callbacks) = events.get_mut(event) {
90            callbacks.retain(|cb| !Arc::ptr_eq(cb, callback));
91        }
92    }
93
94    /// 添加一次性事件监听器
95    /// 
96    /// 使用该方法添加的监听器函数将在发布一次事件成功执行后移除。
97    /// 
98    /// Add a one-time event listener
99    /// 
100    /// Listener functions added by this method will be removed after publishing an event successfully.
101    /// 
102    // pub fn once(&self, event: &str, callback: EventCallback) {
103    //     let callback_wrapper = Arc::new(move || {
104    //         self.off(event, &callback);
105    //         (*callback)();
106    //     });
107    //     self.on(event, callback_wrapper);
108    // }
109
110    
111
112    /// 触发事件
113    /// 
114    /// 触发相当于“发布-订阅”模式中的“发布”,一但某个事件被触发,该事件对应得所有监听器函数都会被执行。监听器就相当于“订阅者”。
115    /// 
116    /// trigger event
117    /// 
118    /// Triggering is equivalent to "publish" in "publish-subscribe" mode. Once an event is triggered, all listeners corresponding to the event will be executed. Listeners are equivalent to "subscribers".
119    /// 
120    pub fn emit(&self, event: &str) {
121        let events = self._events.lock().unwrap();
122        if let Some(callbacks) = events.get(event) {
123            for callback in callbacks {
124                let callback_clone = callback.clone();
125                // Spawn a new thread to run each callback asynchronously
126                std::thread::spawn(move || {
127                    (*callback_clone)();
128                });
129            }
130        }
131    }
132
133    /// 移除所有事件的所有监听器
134    /// Remove all listeners for all events.
135    pub fn remove_all_listeners(&self, event: &str) {
136        let mut events = self._events.lock().unwrap();
137        events.remove(event);
138    }
139
140    pub fn prepend_listener(&self, event: &str, callback: EventCallback) {
141        let mut events = self._events.lock().unwrap();
142        let callbacks = events.entry(event.to_string()).or_insert(Vec::new());
143        callbacks.insert(0, callback);
144    }
145
146    // pub fn prepend_once_listener(&self, event: &str, callback: EventCallback) {
147    //     let callback_wrapper = Arc::new(move || {
148    //         self.off(event, &callback);
149    //         (*callback)();
150    //     });
151    //     self.prepend_listener(event, callback_wrapper);
152    // }
153
154    /// 获取指定事件的监听器
155    /// 
156    /// Gets the listener for the specified event.
157    /// 
158    pub fn listeners(&self, event: &str) -> Vec<EventCallback> {
159        let events = self._events.lock().unwrap();
160        if let Some(callbacks) = events.get(event) {
161            callbacks.clone()
162        } else {
163            Vec::new()
164        }
165    }
166
167    /// 获取指定事件的监听器数量
168    /// 
169    /// Gets the number of listeners for the specified event.
170    pub fn listener_count(&self, event: &str) -> usize {
171        let events = self._events.lock().unwrap();
172        if let Some(callbacks) = events.get(event) {
173            callbacks.len()
174        } else {
175            0
176        }
177    }
178}