package utils import ( "sync" ) type Listener interface { OnUpdate(instance interface{}) } type ListenerFunc func(instance interface{}) func (f ListenerFunc) OnUpdate(instance interface{}) { f(instance) } type Broadcaster struct { listenerLock sync.RWMutex listeners []Listener } func NewBroadcaster() *Broadcaster { return &Broadcaster{} } func (b *Broadcaster) Add(listener Listener) { b.listenerLock.Lock() defer b.listenerLock.Unlock() b.listeners = append(b.listeners, listener) } func (b *Broadcaster) Notify(instance interface{}) { b.listenerLock.RLock() listeners := b.listeners b.listenerLock.RUnlock() for _, listener := range listeners { go listener.OnUpdate(instance) } }