timebucket.go (37 lines of code) (raw):
package main
import "time"
type TimeBucket struct {
endTime time.Time
size time.Duration
delay time.Duration
}
func newTimeBucket(endTime time.Time, bucketSize time.Duration, minDelay time.Duration) *TimeBucket {
// Ensure the endTime is at least minDelay in the past.
if endTime.After(time.Now().Add(-minDelay)) {
endTime = time.Now().Add(-minDelay)
}
// Truncate to the size of the bucket
endTime = endTime.Round(bucketSize)
return &TimeBucket{
endTime: endTime,
size: bucketSize,
delay: minDelay,
}
}
func (b *TimeBucket) getStartTime() time.Time {
return b.getEndTime().Add(-b.size)
}
func (b *TimeBucket) getEndTime() time.Time {
return b.endTime
}
func (b *TimeBucket) untick() {
b.endTime = b.endTime.Add(-b.size)
}
func (b *TimeBucket) tick() bool {
var newEndTime = b.endTime.Add(b.size)
var nowWithAdjustedDelay = time.Now().Add(-b.delay).Round(b.size)
// Only tick if we can still keep our delay!
if newEndTime.Before(nowWithAdjustedDelay) || newEndTime.Equal(nowWithAdjustedDelay) {
b.endTime = newEndTime
return true
} else {
return false
}
}