You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
45 lines
1.3 KiB
45 lines
1.3 KiB
// Package clock represents a dateless time of day.
|
|
package clock
|
|
|
|
import "fmt"
|
|
|
|
const (
|
|
testVersion = 3
|
|
minutesPerHour = 60
|
|
minutesPerDay = 1440
|
|
)
|
|
|
|
// A Clock stores a minute value representing a time of day.
|
|
type Clock int
|
|
|
|
// String returns an hour:minute representation of the Clock.
|
|
func (c Clock) String() string {
|
|
return fmt.Sprintf("%02d:%02d", c/minutesPerHour, c%minutesPerHour)
|
|
}
|
|
|
|
// Add returns a Clock adjusted by the number of minutes specified.
|
|
func (c Clock) Add(minutes int) Clock {
|
|
return parseTime(0, int(c)+minutes)
|
|
}
|
|
|
|
// New returns a Clock constructed from the given hour and minute values.
|
|
func New(hour, minutes int) Clock {
|
|
return parseTime(hour, minutes)
|
|
}
|
|
|
|
// parseTime computes the number of minutes that represent the time.
|
|
func parseTime(hour, minutes int) Clock {
|
|
// Compute the total minutes, factoring away multiple day values.
|
|
total := (hour*minutesPerHour + minutes) % minutesPerDay
|
|
// If total minutes is negative, roll forward one day.
|
|
if total < 0 {
|
|
total += minutesPerDay
|
|
}
|
|
return Clock(total)
|
|
}
|
|
|
|
// Benchmark versus previous iteration:
|
|
//
|
|
// benchmark old ns/op new ns/op delta
|
|
// BenchmarkAddMinutes-12 45.7 29.7 -35.01%
|
|
// BenchmarkCreateClocks-12 52.1 33.9 -34.93%
|