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