Skip to content

Commit 484a0e6

Browse files
committed
Add events implementation
Signed-off-by: Yevhen Vydolob <[email protected]>
1 parent 03e30bb commit 484a0e6

File tree

1 file changed

+54
-0
lines changed

1 file changed

+54
-0
lines changed

pkg/events/emitter.go

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
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+
}

0 commit comments

Comments
 (0)