package emitter import "git.maximhutz.com/max/lambda/pkg/set" type Observer struct { fn func() message string emitter *Emitter } type Emitter struct { listeners map[string]*set.Set[*Observer] } func Ignore[T any](fn func()) func(T) { return func(T) { fn() } } func (e *Emitter) On(message string, fn func()) *Observer { observer := &Observer{ fn: fn, message: message, emitter: e, } if e.listeners == nil { e.listeners = map[string]*set.Set[*Observer]{} } if e.listeners[message] == nil { e.listeners[message] = set.New[*Observer]() } e.listeners[message].Add(observer) return observer } func (o *Observer) Off() { if o.emitter.listeners[o.message] == nil { return } o.emitter.listeners[o.message].Remove(o) } func (e *Emitter) Emit(message string) { if e.listeners[message] == nil { return } for listener := range *e.listeners[message] { listener.fn() } }