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