mirror of
https://github.com/Theodor-Springmann-Stiftung/kgpz_web.git
synced 2025-10-29 00:55:32 +00:00
Broken! Do not execute!
This commit is contained in:
52
helpers/evmux.go
Normal file
52
helpers/evmux.go
Normal 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)
|
||||
}
|
||||
Reference in New Issue
Block a user