| 123456789101112131415161718192021222324252627282930313233343536373839404142 | 
							- package entities
 
- import "sync"
 
- type Broadcast[T any] struct {
 
- 	l        *sync.RWMutex
 
- 	onClose  func()
 
- 	listener []func(T)
 
- }
 
- type BytesIOListener = Broadcast[[]byte]
 
- func NewBroadcast[T any]() *Broadcast[T] {
 
- 	return &Broadcast[T]{
 
- 		l: &sync.RWMutex{},
 
- 	}
 
- }
 
- func (r *Broadcast[T]) Listen(f func(T)) {
 
- 	r.l.Lock()
 
- 	defer r.l.Unlock()
 
- 	r.listener = append(r.listener, f)
 
- }
 
- func (r *Broadcast[T]) OnClose(f func()) {
 
- 	r.onClose = f
 
- }
 
- func (r *Broadcast[T]) Close() {
 
- 	if r.onClose != nil {
 
- 		r.onClose()
 
- 	}
 
- }
 
- func (r *Broadcast[T]) Send(data T) {
 
- 	r.l.RLock()
 
- 	defer r.l.RUnlock()
 
- 	for _, listener := range r.listener {
 
- 		listener(data)
 
- 	}
 
- }
 
 
  |