listener.go 648 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package entities
  2. import "sync"
  3. type Broadcast[T any] struct {
  4. l *sync.RWMutex
  5. onClose func()
  6. listener []func(T)
  7. }
  8. type BytesIOListener = Broadcast[[]byte]
  9. func NewBroadcast[T any]() *Broadcast[T] {
  10. return &Broadcast[T]{
  11. l: &sync.RWMutex{},
  12. }
  13. }
  14. func (r *Broadcast[T]) Listen(f func(T)) {
  15. r.l.Lock()
  16. defer r.l.Unlock()
  17. r.listener = append(r.listener, f)
  18. }
  19. func (r *Broadcast[T]) OnClose(f func()) {
  20. r.onClose = f
  21. }
  22. func (r *Broadcast[T]) Close() {
  23. if r.onClose != nil {
  24. r.onClose()
  25. }
  26. }
  27. func (r *Broadcast[T]) Send(data T) {
  28. r.l.RLock()
  29. defer r.l.RUnlock()
  30. for _, listener := range r.listener {
  31. listener(data)
  32. }
  33. }