// Copyright 2022 Kentaro Hibino. All rights reserved.
// Use of this source code is governed by a MIT license
// that can be found in the LICENSE file.

// Package timeutil exports functions and types related to time and date.
package timeutil import ( ) // A Clock is an object that can tell you the current time. // // This interface allows decoupling code that uses time from the code that creates // a point in time. You can use this to your advantage by injecting Clocks into interfaces // rather than having implementations call time.Now() directly. // // Use RealClock() in production. // Use SimulatedClock() in test. type Clock interface { Now() time.Time } func () Clock { return &realTimeClock{} } type realTimeClock struct{} func ( *realTimeClock) () time.Time { return time.Now() } // A SimulatedClock is a concrete Clock implementation that doesn't "tick" on its own. // Time is advanced by explicit call to the AdvanceTime() or SetTime() functions. // This object is concurrency safe. type SimulatedClock struct { mu sync.Mutex t time.Time // guarded by mu } func ( time.Time) *SimulatedClock { return &SimulatedClock{t: } } func ( *SimulatedClock) () time.Time { .mu.Lock() defer .mu.Unlock() return .t } func ( *SimulatedClock) ( time.Time) { .mu.Lock() defer .mu.Unlock() .t = } func ( *SimulatedClock) ( time.Duration) { .mu.Lock() defer .mu.Unlock() .t = .t.Add() }