// NewMultiNotifyWatcher creates a NotifyWatcher that combines // each of the NotifyWatchers passed in. Each watcher's initial // event is consumed, and a single initial event is sent. // Subsequent events are not coalesced. func NewMultiNotifyWatcher(w ...state.NotifyWatcher) *MultiNotifyWatcher { m := &MultiNotifyWatcher{ watchers: w, changes: make(chan struct{}), } var wg sync.WaitGroup wg.Add(len(w)) staging := make(chan struct{}) for _, w := range w { // Consume the first event of each watcher. <-w.Changes() go func(w state.NotifyWatcher) { defer wg.Done() m.tomb.Kill(w.Wait()) }(w) // Copy events from the watcher to the staging channel. go copyEvents(staging, w.Changes(), &m.tomb) } go func() { defer m.tomb.Done() m.loop(staging) wg.Wait() }() return m }