github.com/rogpeppe/clock@v0.0.0-20190514195947-2896927a307a/clock.go (about)

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the LGPLv3, see LICENCE file for details.
     3  
     4  package clock
     5  
     6  import "time"
     7  
     8  // Clock provides an interface for dealing with clocks.
     9  type Clock interface {
    10  	// Now returns the current clock time.
    11  	Now() time.Time
    12  
    13  	// After waits for the duration to elapse and then sends the
    14  	// current time on the returned channel.
    15  	After(time.Duration) <-chan time.Time
    16  
    17  	// AfterFunc waits for the duration to elapse and then calls f in its own goroutine.
    18  	// It returns a Timer that can be used to cancel the call using its Stop method.
    19  	AfterFunc(d time.Duration, f func()) Timer
    20  
    21  	// NewTimer creates a new Timer that will send the current time
    22  	// on its channel after at least duration d.
    23  	NewTimer(d time.Duration) Timer
    24  }
    25  
    26  // Alarm returns a channel that will have the time sent on it at some point
    27  // after the supplied time occurs.
    28  //
    29  // This is short for c.After(t.Sub(c.Now())).
    30  func Alarm(c Clock, t time.Time) <-chan time.Time {
    31  	return c.After(t.Sub(c.Now()))
    32  }
    33  
    34  // The Timer type represents a single event.
    35  // A Timer must be created with AfterFunc.
    36  // This interface follows time.Timer's methods but provides easier mocking.
    37  type Timer interface {
    38  	// When the Timer expires, the current time will be sent on the
    39  	// channel returned from Chan, unless the Timer was created by
    40  	// AfterFunc.
    41  	Chan() <-chan time.Time
    42  
    43  	// Reset changes the timer to expire after duration d.
    44  	// It returns true if the timer had been active, false if
    45  	// the timer had expired or been stopped.
    46  	Reset(time.Duration) bool
    47  
    48  	// Stop prevents the Timer from firing. It returns true if
    49  	// the call stops the timer, false if the timer has already expired or been stopped.
    50  	// Stop does not close the channel, to prevent a read
    51  	// from the channel succeeding incorrectly.
    52  	Stop() bool
    53  }