1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package ui
- type Broadcast struct {
- listeners []chan State
- reg chan (chan State)
- in chan State
- }
- func NewBroadcast() *Broadcast {
- b := &Broadcast{
- listeners: make([]chan State, 0),
- reg: make(chan (chan State)),
- in: make(chan State),
- }
- go func() {
- for {
- select {
- case l := <-b.reg:
- b.listeners = append(b.listeners, l)
- case item := <-b.in:
- for _, l := range b.listeners {
- l <- item
- }
- }
- }
- }()
- return b
- }
- func (b *Broadcast) In() chan State {
- return b.in
- }
- func (b *Broadcast) Reg() chan State {
- listener := make(chan State)
- b.reg <- listener
- return listener
- }
|