1
+ from typing import Callable
2
+
1
3
class EventEmitter :
2
4
def __init__ (self ) -> None :
3
- self .listeners : dict [str , list ] = {}
5
+ self .listeners : dict [str , list [ Callable ] ] = {}
4
6
5
7
def emit (self , evt : str , * args , ** kwargs ):
6
8
if evt not in self .listeners :
@@ -11,11 +13,38 @@ def emit(self, evt: str, *args, **kwargs):
11
13
for listener in listeners :
12
14
listener (* args , ** kwargs )
13
15
14
- def on (self , evt : str , listener ):
15
- if evt not in self .listeners :
16
- self .listeners [evt ] = []
16
+ def on (self , evt : str , listener : Callable | None = None ):
17
+
18
+ def decorator (listener : Callable ):
19
+ if evt not in self .listeners :
20
+ self .listeners [evt ] = []
17
21
18
- self .listeners [evt ].append (listener )
22
+ self .listeners [evt ].append (listener )
23
+
24
+ if listener is None :
25
+ return decorator
26
+
27
+ decorator (listener = listener )
28
+
29
+ def remove_all_listeners (self , evt : str ):
30
+ if evt not in self .listeners :
31
+ return
32
+
33
+ del self .listeners [evt ]
34
+
35
+ def remove_listener (self , evt : str , listener : Callable ):
36
+ if evt not in self .listeners :
37
+ return
38
+
39
+ self .listeners [evt ].remove (listener )
40
+
41
+ if len (self .listeners [evt ]) == 0 :
42
+ del self .listeners [evt ]
43
+
44
+ def off (self , evt : str , listener : Callable ):
45
+ """ alias for remove_listener
46
+ """
47
+ self .remove_listener (evt , listener = listener )
19
48
20
49
class PlatformNotSupported (Exception ):
21
50
def __init__ (self , * args : object ) -> None :
0 commit comments