34 lines
788 B
Go
34 lines
788 B
Go
package signal
|
|
|
|
import (
|
|
"sync"
|
|
)
|
|
|
|
// Signal lets goroutines signal that some event has occurred. Other goroutines can wait for the signal.
|
|
type Signal struct {
|
|
ch chan struct{}
|
|
once sync.Once
|
|
}
|
|
|
|
// New wraps a channel and turns it into a signal for a one-time event.
|
|
func New(ch chan struct{}) *Signal {
|
|
return &Signal{
|
|
ch: ch,
|
|
once: sync.Once{},
|
|
}
|
|
}
|
|
|
|
// Notify alerts any goroutines waiting on this signal that the event has occurred.
|
|
// After the first call to Notify(), future calls are no-op.
|
|
func (s *Signal) Notify() {
|
|
s.once.Do(func() {
|
|
close(s.ch)
|
|
})
|
|
}
|
|
|
|
// Wait returns a channel which will be written to when Notify() is called for the first time.
|
|
// This channel will never be written to a second time.
|
|
func (s *Signal) Wait() <-chan struct{} {
|
|
return s.ch
|
|
}
|