Skip to content

Commit

Permalink
Add events implementation
Browse files Browse the repository at this point in the history
Signed-off-by: Yevhen Vydolob <[email protected]>
  • Loading branch information
evidolob committed Oct 10, 2023
1 parent 03e30bb commit 484a0e6
Showing 1 changed file with 54 additions and 0 deletions.
54 changes: 54 additions & 0 deletions pkg/events/emitter.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
package events

import (
"sync"
)

type Event[T any] interface {
AddListener(listener Listener[T]) Disposable
Fire(data T)
}

type Disposable func()

type Listener[T any] func(event T)

type listenerWrapper[T any] struct {
Listener Listener[T]
}

type event[T any] struct {
listeners map[int]*listenerWrapper[T]
eventMutex sync.Mutex
keyCounter int
}

func NewEvent[T any]() Event[T] {
return &event[T]{
listeners: make(map[int]*listenerWrapper[T]),
}
}

func (e *event[T]) AddListener(listener Listener[T]) Disposable {
e.eventMutex.Lock()
e.keyCounter++
key := e.keyCounter
e.listeners[key] = &listenerWrapper[T]{
Listener: listener,
}
e.eventMutex.Unlock()
return func() {
e.eventMutex.Lock()
defer e.eventMutex.Unlock()

delete(e.listeners, key)
}
}

func (e *event[T]) Fire(event T) {
e.eventMutex.Lock()
defer e.eventMutex.Unlock()
for _, l := range e.listeners {
l.Listener(event)
}
}

0 comments on commit 484a0e6

Please sign in to comment.