package sync // Waker is used to wake up a sleeper when some event occurs. It debounces // multiple wakeup calls occurring between each sleep, and wakeups are // non-blocking to avoid having to coordinate goroutines. type Waker struct { wakeCh chan struct{} } // NewWaker creates a new Waker. func NewWaker() *Waker { return &Waker{ wakeCh: make(chan struct{}, 1), // buffer used for debouncing } } // Sleep returns a channel that blocks until Wake() is called. func (w *Waker) Sleep() <-chan struct{} { return w.wakeCh } // Wake wakes up the sleeper. func (w *Waker) Wake() { // A non-blocking send with a size 1 buffer ensures that we never block, and // that we queue up at most a single wakeup call between each Sleep(). select { case w.wakeCh <- struct{}{}: default: } }