blob: 59a511d053265d235d035f1b3f7f588f58f8809c [file] [log] [blame]
David K. Bainbridge528b3182017-01-23 08:51:59 -08001// Copyright 2015 Canonical Ltd.
2// Licensed under the LGPLv3, see LICENCE file for details.
3
4package clock
5
6import "time"
7
8// Clock provides an interface for dealing with clocks.
9type 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())).
30func 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.
37type 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}