package emitter import "git.maximhutz.com/max/lambda/pkg/set" type Emitter[E comparable] interface { On(E, func()) Listener[E] Off(Listener[E]) Emit(E) } type BaseEmitter[E comparable] struct { listeners map[E]set.Set[Listener[E]] } func (e *BaseEmitter[E]) On(kind E, fn func()) Listener[E] { if e.listeners[kind] == nil { e.listeners[kind] = set.New[Listener[E]]() } listener := &BaseListener[E]{kind, fn} e.listeners[kind].Add(listener) return listener } func (e *BaseEmitter[E]) Off(listener Listener[E]) { kind := listener.Kind() if e.listeners[kind] != nil { e.listeners[kind].Remove(listener) } } func (e *BaseEmitter[E]) Emit(event E) { if e.listeners[event] == nil { e.listeners[event] = set.New[Listener[E]]() } for listener := range e.listeners[event].Items() { listener.Run() } } func New[E comparable]() *BaseEmitter[E] { return &BaseEmitter[E]{ listeners: map[E]set.Set[Listener[E]]{}, } }