File tree Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Expand file tree Collapse file tree 1 file changed +54
-0
lines changed Original file line number Diff line number Diff line change
1
+ package events
2
+
3
+ import (
4
+ "sync"
5
+ )
6
+
7
+ type Event [T any ] interface {
8
+ AddListener (listener Listener [T ]) Disposable
9
+ Fire (data T )
10
+ }
11
+
12
+ type Disposable func ()
13
+
14
+ type Listener [T any ] func (event T )
15
+
16
+ type listenerWrapper [T any ] struct {
17
+ Listener Listener [T ]
18
+ }
19
+
20
+ type event [T any ] struct {
21
+ listeners map [int ]* listenerWrapper [T ]
22
+ eventMutex sync.Mutex
23
+ keyCounter int
24
+ }
25
+
26
+ func NewEvent [T any ]() Event [T ] {
27
+ return & event [T ]{
28
+ listeners : make (map [int ]* listenerWrapper [T ]),
29
+ }
30
+ }
31
+
32
+ func (e * event [T ]) AddListener (listener Listener [T ]) Disposable {
33
+ e .eventMutex .Lock ()
34
+ e .keyCounter ++
35
+ key := e .keyCounter
36
+ e .listeners [key ] = & listenerWrapper [T ]{
37
+ Listener : listener ,
38
+ }
39
+ e .eventMutex .Unlock ()
40
+ return func () {
41
+ e .eventMutex .Lock ()
42
+ defer e .eventMutex .Unlock ()
43
+
44
+ delete (e .listeners , key )
45
+ }
46
+ }
47
+
48
+ func (e * event [T ]) Fire (event T ) {
49
+ e .eventMutex .Lock ()
50
+ defer e .eventMutex .Unlock ()
51
+ for _ , l := range e .listeners {
52
+ l .Listener (event )
53
+ }
54
+ }
You can’t perform that action at this time.
0 commit comments