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}