github.com/soypat/vectytemplater@v0.0.0-20220501050640-d40b24e35168/_templates/default/store/storeutil/storeutil.go (about) 1 // Package storeutil contains a ListenerRegistry type. Ripped from vecty examples with a few modifications. 2 package storeutil 3 4 // ListenerRegistry is a listener registry. 5 // The zero value is unfit for use; use NewListenerRegistry to create an instance. 6 type ListenerRegistry struct { 7 listeners map[interface{}]func(action interface{}) 8 } 9 10 // NewListenerRegistry creates a listener registry. 11 func NewListenerRegistry() *ListenerRegistry { 12 return &ListenerRegistry{ 13 listeners: make(map[interface{}]func(interface{})), 14 } 15 } 16 17 // Add adds listener with key to the registry. 18 // key may be nil, then an arbitrary unused key is assigned. 19 // It panics if a listener with same key is already present. 20 func (r *ListenerRegistry) Add(key interface{}, listener func(action interface{})) { 21 if key == nil { 22 key = new(int) 23 } 24 if _, ok := r.listeners[key]; ok { 25 panic("duplicate listener key") 26 } 27 r.listeners[key] = listener 28 } 29 30 // Remove removes a listener with key from the registry. 31 func (r *ListenerRegistry) Remove(key interface{}) { 32 delete(r.listeners, key) 33 } 34 35 // Fire invokes all listeners in the registry. 36 func (r *ListenerRegistry) Fire(action interface{}) { 37 for _, l := range r.listeners { 38 l(action) 39 } 40 }