@@ -24,175 +24,3 @@ public struct CallbackEventListener<EventType: Event>: EventListener {
2424 callback ( event)
2525 }
2626}
27-
28- /// Event emitter protocol that provides event emission capabilities
29- public protocol EventEmitter : AnyObject {
30- /// Add a typed event listener for a specific event type
31- /// - Parameter listener: The event listener
32- /// - Returns: Unique listener ID that can be used to remove the listener
33- func addListener< T: Event > ( _ listener: CallbackEventListener < T > ) -> Int
34-
35- /// Add a callback function as a listener for a specific event type
36- /// - Parameter callback: The callback function
37- /// - Returns: Unique listener ID that can be used to remove the listener
38- func addCallbackListener< T: Event > ( _ callback: @escaping ( T ) -> Void ) -> Int
39-
40- /// Remove a listener by its ID
41- /// - Parameter listenerId: The listener ID
42- /// - Returns: true if the listener was found and removed, false otherwise
43- func removeListener( _ listenerId: Int ) -> Bool
44-
45- /// Remove all listeners for a specific event type, or all listeners if no type is specified
46- func removeAllListeners< T: Event > ( _ eventType: T . Type )
47- func removeAllListeners( )
48-
49- /// Get the number of listeners registered for a specific event type
50- func getListenerCount< T: Event > ( _ eventType: T . Type ) -> Int
51-
52- /// Get the total number of registered listeners across all event types
53- var totalListenerCount : Int { get }
54-
55- /// Check if there are any listeners for a specific event type
56- func hasListeners< T: Event > ( _ eventType: T . Type ) -> Bool
57-
58- /// Emit an event synchronously to all registered listeners
59- func emitSync< T: Event > ( _ event: T )
60-
61- /// Emit an event synchronously using a factory function
62- func emitSyncWithFactory< T: Event > ( _ eventFactory: ( ) -> T )
63-
64- /// Emit an event asynchronously
65- func emitAsync< T: Event > ( _ event: T )
66-
67- /// Emit an event asynchronously using a factory function
68- func emitAsyncWithFactory< T: Event > ( _ eventFactory: @escaping ( ) -> T )
69-
70- /// Dispose of the event emitter and clean up resources
71- func disposeEventEmitter( )
72- }
73-
74- /// Default implementation of EventEmitter
75- open class BaseEventEmitter : EventEmitter {
76- /// Map of event types to their listeners
77- private var listeners : [ String : [ Int : any EventListener ] ] = [ : ]
78-
79- /// Counter for generating unique listener IDs
80- private var nextListenerId : Int = 0
81-
82- /// Queue for asynchronous event emission
83- private let eventQueue = DispatchQueue ( label: " EventEmitter.queue " , qos: . userInitiated)
84-
85- public init ( ) { }
86-
87- public func addListener< T: Event > ( _ listener: CallbackEventListener < T > ) -> Int {
88- let eventType = T . eventType
89- let listenerId = nextListenerId
90- nextListenerId += 1
91-
92- if listeners [ eventType] == nil {
93- listeners [ eventType] = [ : ]
94- }
95- listeners [ eventType] ![ listenerId] = listener
96-
97- return listenerId
98- }
99-
100- public func addCallbackListener< T: Event > ( _ callback: @escaping ( T ) -> Void ) -> Int {
101- let listener = CallbackEventListener < T > ( callback)
102- return addListener ( listener)
103- }
104-
105- public func removeListener( _ listenerId: Int ) -> Bool {
106- for (eventType, eventListeners) in listeners {
107- var mutableListeners = eventListeners
108- if mutableListeners. removeValue ( forKey: listenerId) != nil {
109- if mutableListeners. isEmpty {
110- listeners. removeValue ( forKey: eventType)
111- } else {
112- listeners [ eventType] = mutableListeners
113- }
114- return true
115- }
116- }
117- return false
118- }
119-
120- public func removeAllListeners< T: Event > ( _ eventType: T . Type ) {
121- listeners. removeValue ( forKey: T . eventType)
122- }
123-
124- public func removeAllListeners( ) {
125- listeners. removeAll ( )
126- }
127-
128- public func getListenerCount< T: Event > ( _ eventType: T . Type ) -> Int {
129- return listeners [ T . eventType] ? . count ?? 0
130- }
131-
132- public var totalListenerCount : Int {
133- return listeners. values. reduce ( 0 ) { $0 + $1. count }
134- }
135-
136- public func hasListeners< T: Event > ( _ eventType: T . Type ) -> Bool {
137- return getListenerCount ( eventType) > 0
138- }
139-
140- public func emitSync< T: Event > ( _ event: T ) {
141- let eventType = T . eventType
142- guard let eventListeners = listeners [ eventType] else { return }
143-
144- // Create a copy of the listeners list to avoid concurrent modification
145- let listenersCopy = Array ( eventListeners. values)
146-
147- for listener in listenersCopy {
148- if let callbackListener = listener as? CallbackEventListener < T > {
149- callbackListener. onEvent ( event)
150- }
151- }
152- }
153-
154- public func emitSyncWithFactory< T: Event > ( _ eventFactory: ( ) -> T ) {
155- let event = eventFactory ( )
156- emitSync ( event)
157- }
158-
159- public func emitAsync< T: Event > ( _ event: T ) {
160- eventQueue. async { [ weak self] in
161- self ? . emitSync ( event)
162- }
163- }
164-
165- public func emitAsyncWithFactory< T: Event > ( _ eventFactory: @escaping ( ) -> T ) {
166- eventQueue. async { [ weak self] in
167- let event = eventFactory ( )
168- self ? . emitSync ( event)
169- }
170- }
171-
172- public func disposeEventEmitter( ) {
173- listeners. removeAll ( )
174- }
175- }
176-
177- /// Extension methods for easier event listener registration
178- public extension EventEmitter {
179- /// Convenience method to add a callback listener using a function
180- func on< T: Event > ( _ callback: @escaping ( T ) -> Void ) -> Int {
181- return addCallbackListener ( callback)
182- }
183-
184- /// Convenience method to add a one-time listener that removes itself after firing
185- func once< T: Event > ( _ callback: @escaping ( T ) -> Void ) -> Int {
186- var listenerId : Int = 0
187- listenerId = addCallbackListener { [ weak self] event in
188- self ? . removeListener ( listenerId)
189- callback ( event)
190- }
191- return listenerId
192- }
193-
194- /// Remove a listener (alias for removeListener)
195- func off( _ listenerId: Int ) -> Bool {
196- return removeListener ( listenerId)
197- }
198- }
0 commit comments