David K. Bainbridge | 528b318 | 2017-01-23 08:51:59 -0800 | [diff] [blame] | 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 | } |