12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- package done
- import (
- "sync"
- )
- // Instance is a utility for notifications of something being done.
- type Instance struct {
- access sync.Mutex
- c chan struct{}
- closed bool
- }
- // New returns a new Done.
- func New() *Instance {
- return &Instance{
- c: make(chan struct{}),
- }
- }
- // Done returns true if Close() is called.
- func (d *Instance) Done() bool {
- select {
- case <-d.Wait():
- return true
- default:
- return false
- }
- }
- // Wait returns a channel for waiting for done.
- func (d *Instance) Wait() <-chan struct{} {
- return d.c
- }
- // Close marks this Done 'done'. This method may be called multiple times. All calls after first call will have no effect on its status.
- func (d *Instance) Close() error {
- d.access.Lock()
- defer d.access.Unlock()
- if d.closed {
- return nil
- }
- d.closed = true
- close(d.c)
- return nil
- }
|