1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
use std::collections::HashMap;
use std::sync::{Arc, Mutex};

type EventCallback = Arc<dyn Fn() + Send + Sync>;

pub struct EventEmitter {
    _events: Mutex<HashMap<String, Vec<EventCallback>>>,
    _max_listeners: usize,
}

impl EventEmitter {
    /// Creates an EventEmitter instance
    /// # Examples
    /// ```
    /// use std::sync::{Arc};
    /// use EventEmitter::EventEmitter;
    /// 
    /// fn main() {
    ///     let emitter = EventEmitter::new();
    /// 
    ///     let callback1 = Arc::new(|| println!("[event1 emitted]: The first callback of event1 has been called."));
    ///     let callback2 = Arc::new(|| println!("[event1 emitted]: The second callback of event1 has been called."));
    ///     let callback3 = Arc::new(|| println!("[event2 emitted]: The only one callbask of event2 has been called."));
    /// 
    ///     // Add event listener
    ///     emitter.on("event1", callback1);
    ///     emitter.add_listener("event1", callback2); // The `add_listene` method is an alias method for the `on` method.
    ///     emitter.on("event2", callback3);
    /// 
    ///     let ct1 = emitter.listener_count("event1");
    ///     let ct2 = emitter.listener_count("event2");
    ///     println!("Number of Listeners for event1 is: {ct1}, \nNumber of Listeners for event2 is: {ct2}");
    /// 
    ///     emitter.emit("event1"); // Emit event1
    ///     emitter.emit("event2"); // Emit event1
    /// }
    /// ```
    /// 
    pub fn new() -> Self {
        EventEmitter {
            _events: Mutex::new(HashMap::new()),
            _max_listeners: usize::MAX,
        }
    }

    /// 设置最大监听器数量
    /// Set the maximum number of listeners
    pub fn set_max_listeners(&mut self, max_listeners: usize) {
        self._max_listeners = max_listeners;
    }

    /// 获取最大监听器数量
    pub fn get_max_listeners(&self) -> usize {
        self._max_listeners
    }

    /// 添加事件监听器
    /// 
    /// 是 `on` 方法的别名
    /// 
    /// Get the maximum number of listeners
    /// 
    /// alias method for the `on` method.
    pub fn add_listener(&self, event: &str, callback: EventCallback) {
        self.on(event, callback);
    }

    /// 添加事件监听器
    /// Add event listener
    pub fn on(&self, event: &str, callback: EventCallback) {
        let mut events = self._events.lock().unwrap();
        let callbacks = events.entry(event.to_string()).or_insert(Vec::new());
        callbacks.push(callback);
    }

    /// 移除事件监听器
    /// 
    /// 是 `off` 方法的别名
    /// 
    /// Remove the event listener
    /// 
    /// alias method for the `off` method.
    pub fn remove_listener(&self, event: &str, callback: &EventCallback) {
        self.off(event, callback);
    }

    pub fn off(&self, event: &str, callback: &EventCallback) {
        let mut events = self._events.lock().unwrap();
        if let Some(callbacks) = events.get_mut(event) {
            callbacks.retain(|cb| !Arc::ptr_eq(cb, callback));
        }
    }

    /// 添加一次性事件监听器
    /// 
    /// 使用该方法添加的监听器函数将在发布一次事件成功执行后移除。
    /// 
    /// Add a one-time event listener
    /// 
    /// Listener functions added by this method will be removed after publishing an event successfully.
    /// 
    // pub fn once(&self, event: &str, callback: EventCallback) {
    //     let callback_wrapper = Arc::new(move || {
    //         self.off(event, &callback);
    //         (*callback)();
    //     });
    //     self.on(event, callback_wrapper);
    // }

    

    /// 触发事件
    /// 
    /// 触发相当于“发布-订阅”模式中的“发布”,一但某个事件被触发,该事件对应得所有监听器函数都会被执行。监听器就相当于“订阅者”。
    /// 
    /// trigger event
    /// 
    /// 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".
    /// 
    pub fn emit(&self, event: &str) {
        let events = self._events.lock().unwrap();
        if let Some(callbacks) = events.get(event) {
            for callback in callbacks {
                let callback_clone = callback.clone();
                // Spawn a new thread to run each callback asynchronously
                std::thread::spawn(move || {
                    (*callback_clone)();
                });
            }
        }
    }

    /// 移除所有事件的所有监听器
    /// Remove all listeners for all events.
    pub fn remove_all_listeners(&self, event: &str) {
        let mut events = self._events.lock().unwrap();
        events.remove(event);
    }

    pub fn prepend_listener(&self, event: &str, callback: EventCallback) {
        let mut events = self._events.lock().unwrap();
        let callbacks = events.entry(event.to_string()).or_insert(Vec::new());
        callbacks.insert(0, callback);
    }

    // pub fn prepend_once_listener(&self, event: &str, callback: EventCallback) {
    //     let callback_wrapper = Arc::new(move || {
    //         self.off(event, &callback);
    //         (*callback)();
    //     });
    //     self.prepend_listener(event, callback_wrapper);
    // }

    /// 获取指定事件的监听器
    /// 
    /// Gets the listener for the specified event.
    /// 
    pub fn listeners(&self, event: &str) -> Vec<EventCallback> {
        let events = self._events.lock().unwrap();
        if let Some(callbacks) = events.get(event) {
            callbacks.clone()
        } else {
            Vec::new()
        }
    }

    /// 获取指定事件的监听器数量
    /// 
    /// Gets the number of listeners for the specified event.
    pub fn listener_count(&self, event: &str) -> usize {
        let events = self._events.lock().unwrap();
        if let Some(callbacks) = events.get(event) {
            callbacks.len()
        } else {
            0
        }
    }
}