mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-28 16:45:32 +00:00
55 lines
1.1 KiB
Go
55 lines
1.1 KiB
Go
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)
|
|
}
|