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  }