ZeroEpsilon/src/frequency_loop.cr

26 lines
511 B
Crystal

class FrequencyLoop
def initialize(@frequency : Time::Span)
@sleep = [] of Time::Span
@span = [] of Time::Span
end
getter :sleep, :frequency, :span
ZERO = Time::Span.zero
def loop(max_tick : Int = UInt64::MAX, &)
i = 0u64
t0 = Time.utc
while max_tick > i
yield i
t1 = Time.utc
span = (t1 - t0)
i += 1
sleep_span = (@frequency * i) - span
@sleep << sleep_span
@span << span
sleep(sleep_span) if sleep_span > ZERO
end
end
end