// Copyright 2015 Canonical Ltd. // Licensed under the LGPLv3, see LICENCE file for details. package clock import "time" // Clock provides an interface for dealing with clocks. type Clock interface { // Now returns the current clock time. Now() time.Time // After waits for the duration to elapse and then sends the // current time on the returned channel. After(time.Duration) <-chan time.Time // AfterFunc waits for the duration to elapse and then calls f in its own goroutine. // It returns a Timer that can be used to cancel the call using its Stop method. AfterFunc(d time.Duration, f func()) Timer // NewTimer creates a new Timer that will send the current time // on its channel after at least duration d. NewTimer(d time.Duration) Timer } // Alarm returns a channel that will have the time sent on it at some point // after the supplied time occurs. // // This is short for c.After(t.Sub(c.Now())). func Alarm(c Clock, t time.Time) <-chan time.Time { return c.After(t.Sub(c.Now())) } // The Timer type represents a single event. // A Timer must be created with AfterFunc. // This interface follows time.Timer's methods but provides easier mocking. type Timer interface { // When the Timer expires, the current time will be sent on the // channel returned from Chan, unless the Timer was created by // AfterFunc. Chan() <-chan time.Time // Reset changes the timer to expire after duration d. // It returns true if the timer had been active, false if // the timer had expired or been stopped. Reset(time.Duration) bool // Stop prevents the Timer from firing. It returns true if // the call stops the timer, false if the timer has already expired or been stopped. // Stop does not close the channel, to prevent a read // from the channel succeeding incorrectly. Stop() bool }