26 lines
511 B
Crystal
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
|