# returns an enumerator which executes block on each nth iteration
def on_nth_run_enum freq, &block
Enumerator.new do |yielder|
loop do
freq.times do
yielder.yield
end
block.call
end
end
end
# an object of this class will execute given block
# every nth time "run" method has been invoked
class OccasionalRunner
def initialize freq, &block
@freq = freq
@block = block
@counter = 0
end
def run
@counter = (@counter + 1) % @freq
@block.call if @counter == 0
end
end
# returns lamda which will execute given block
# every nth time being called
def on_nth_run_fun freq, &block
counter = 0
-> {
counter = (counter + 1) % freq
block.call if counter == 0
}
end
janitor_enum = on_nth_run_enum 3 do
puts 'cleanup - enumerable way'
end
janitor_oo = OccasionalRunner.new 3 do
puts 'cleanup - OO way'
end
janitor_fun = on_nth_run_fun 3 do
puts 'cleanup - functional style'
end
(1..10).each do |i|
puts i
janitor_enum.next
janitor_oo.run
janitor_fun.call
end
IyByZXR1cm5zIGFuIGVudW1lcmF0b3Igd2hpY2ggZXhlY3V0ZXMgYmxvY2sgb24gZWFjaCBudGggaXRlcmF0aW9uCmRlZiBvbl9udGhfcnVuX2VudW0gZnJlcSwgJmJsb2NrCiAgRW51bWVyYXRvci5uZXcgZG8gfHlpZWxkZXJ8CiAgICBsb29wIGRvCiAgICAgIGZyZXEudGltZXMgZG8KICAgICAgICB5aWVsZGVyLnlpZWxkCiAgICAgIGVuZAogICAgICBibG9jay5jYWxsCiAgICBlbmQKICBlbmQKZW5kCgojIGFuIG9iamVjdCBvZiB0aGlzIGNsYXNzIHdpbGwgZXhlY3V0ZSBnaXZlbiBibG9jawojIGV2ZXJ5IG50aCB0aW1lICJydW4iIG1ldGhvZCBoYXMgYmVlbiBpbnZva2VkCmNsYXNzIE9jY2FzaW9uYWxSdW5uZXIKICBkZWYgaW5pdGlhbGl6ZSBmcmVxLCAmYmxvY2sKICAgIEBmcmVxID0gZnJlcQogICAgQGJsb2NrID0gYmxvY2sKICAgIEBjb3VudGVyID0gMAogIGVuZAogCiAgZGVmIHJ1bgogICAgQGNvdW50ZXIgPSAoQGNvdW50ZXIgKyAxKSAlIEBmcmVxCiAgICBAYmxvY2suY2FsbCBpZiBAY291bnRlciA9PSAwCiAgZW5kCmVuZAoKIyByZXR1cm5zIGxhbWRhIHdoaWNoIHdpbGwgZXhlY3V0ZSBnaXZlbiBibG9jawojIGV2ZXJ5IG50aCB0aW1lIGJlaW5nIGNhbGxlZApkZWYgb25fbnRoX3J1bl9mdW4gZnJlcSwgJmJsb2NrCiAgY291bnRlciA9IDAKICAtPiB7CiAgICBjb3VudGVyID0gKGNvdW50ZXIgKyAxKSAlIGZyZXEKICAgIGJsb2NrLmNhbGwgaWYgY291bnRlciA9PSAwCiAgfQplbmQKCmphbml0b3JfZW51bSA9IG9uX250aF9ydW5fZW51bSAzIGRvCiAgcHV0cyAnY2xlYW51cCAtIGVudW1lcmFibGUgd2F5JwplbmQKIApqYW5pdG9yX29vID0gT2NjYXNpb25hbFJ1bm5lci5uZXcgMyBkbwogIHB1dHMgJ2NsZWFudXAgLSBPTyB3YXknCmVuZAoKamFuaXRvcl9mdW4gPSBvbl9udGhfcnVuX2Z1biAzIGRvCiAgcHV0cyAnY2xlYW51cCAtIGZ1bmN0aW9uYWwgc3R5bGUnCmVuZAogCigxLi4xMCkuZWFjaCBkbyB8aXwKICBwdXRzIGkKICBqYW5pdG9yX2VudW0ubmV4dAogIGphbml0b3Jfb28ucnVuCiAgamFuaXRvcl9mdW4uY2FsbAplbmQ=