Broken! Do not execute!

This commit is contained in:
Simon Martens
2024-11-11 14:03:57 +01:00
parent 28ea04f50d
commit 8be5c6a4d7
3 changed files with 152 additions and 50 deletions

52
helpers/evmux.go Normal file
View File

@@ -0,0 +1,52 @@
package helpers
import "sync"
type EventMux[T any] struct {
// INFO: This is a simple event multiplexer that allows to subscribe to events and to publish them.
mu sync.Mutex
subscribers []chan T
}
func NewEventMux[T any]() *EventMux[T] {
return &EventMux[T]{
subscribers: make([]chan T, 0),
}
}
func (e *EventMux[T]) Subscribe(size uint) chan T {
e.mu.Lock()
defer e.mu.Unlock()
subscriber := make(chan T, size)
e.subscribers = append(e.subscribers, subscriber)
return subscriber
}
func (e *EventMux[T]) Unsubscribe(subscriber chan T) {
e.mu.Lock()
defer e.mu.Unlock()
for i, s := range e.subscribers {
if s == subscriber {
close(s)
e.subscribers = append(e.subscribers[:i], e.subscribers[i+1:]...)
return
}
}
}
func (e *EventMux[T]) Publish(event T) {
e.mu.Lock()
defer e.mu.Unlock()
for _, subscriber := range e.subscribers {
subscriber <- event
}
}
func (e *EventMux[T]) Close() {
e.mu.Lock()
defer e.mu.Unlock()
for _, subscriber := range e.subscribers {
close(subscriber)
}
e.subscribers = make([]chan T, 0)
}