broadcast.go 641 B

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package ui
  2. type Broadcast struct {
  3. listeners []chan State
  4. reg chan (chan State)
  5. in chan State
  6. }
  7. func NewBroadcast() *Broadcast {
  8. b := &Broadcast{
  9. listeners: make([]chan State, 0),
  10. reg: make(chan (chan State)),
  11. in: make(chan State),
  12. }
  13. go func() {
  14. for {
  15. select {
  16. case l := <-b.reg:
  17. b.listeners = append(b.listeners, l)
  18. case item := <-b.in:
  19. for _, l := range b.listeners {
  20. l <- item
  21. }
  22. }
  23. }
  24. }()
  25. return b
  26. }
  27. func (b *Broadcast) In() chan State {
  28. return b.in
  29. }
  30. func (b *Broadcast) Reg() chan State {
  31. listener := make(chan State)
  32. b.reg <- listener
  33. return listener
  34. }