| package clock |
| |
| import "time" |
| |
| type Clock interface { |
| Now() time.Time |
| Sleep(d time.Duration) |
| Since(t time.Time) time.Duration |
| // After waits for the duration to elapse and then sends the current time |
| // on the returned channel. |
| // It is equivalent to clock.NewTimer(d).C. |
| // The underlying Timer is not recovered by the garbage collector |
| // until the timer fires. If efficiency is a concern, use clock.NewTimer |
| // instead and call Timer.Stop if the timer is no longer needed. |
| After(d time.Duration) <-chan time.Time |
| |
| NewTimer(d time.Duration) Timer |
| NewTicker(d time.Duration) Ticker |
| } |
| |
| type realClock struct{} |
| |
| func NewClock() Clock { |
| return &realClock{} |
| } |
| |
| func (clock *realClock) Now() time.Time { |
| return time.Now() |
| } |
| |
| func (clock *realClock) Since(t time.Time) time.Duration { |
| return time.Now().Sub(t) |
| } |
| |
| func (clock *realClock) Sleep(d time.Duration) { |
| <-clock.NewTimer(d).C() |
| } |
| |
| func (clock *realClock) After(d time.Duration) <-chan time.Time { |
| return clock.NewTimer(d).C() |
| } |
| |
| func (clock *realClock) NewTimer(d time.Duration) Timer { |
| return &realTimer{ |
| t: time.NewTimer(d), |
| } |
| } |
| |
| func (clock *realClock) NewTicker(d time.Duration) Ticker { |
| return &realTicker{ |
| t: time.NewTicker(d), |
| } |
| } |