| 12345678910111213141516171819202122232425262728293031323334353637383940414243 | 
							- package signal
 
- import "io"
 
- // Notifier is a utility for notifying changes. The change producer may notify changes multiple time, and the consumer may get notified asynchronously.
 
- type Notifier struct {
 
- 	c chan struct{}
 
- }
 
- // NewNotifier creates a new Notifier.
 
- func NewNotifier() *Notifier {
 
- 	return &Notifier{
 
- 		c: make(chan struct{}, 1),
 
- 	}
 
- }
 
- // Signal signals a change, usually by producer. This method never blocks.
 
- func (n *Notifier) Signal() {
 
- 	select {
 
- 	case n.c <- struct{}{}:
 
- 	default:
 
- 	}
 
- }
 
- // Wait returns a channel for waiting for changes. The returned channel never gets closed.
 
- func (n *Notifier) Wait() <-chan struct{} {
 
- 	return n.c
 
- }
 
- type nCloser struct {
 
- 	n *Notifier
 
- }
 
- func (c *nCloser) Close() error {
 
- 	c.n.Signal()
 
- 	return nil
 
- }
 
- func NotifyClose(n *Notifier) io.Closer {
 
- 	return &nCloser{
 
- 		n: n,
 
- 	}
 
- }
 
 
  |