#!/usr/bin/env ruby

class Task
  attr_reader :delay, :func, :last
  attr_writer :last

  def initialize(delay, func)
    @delay = delay
    @func = func
    @last = Time.now.to_i
  end
end

class Scheduler
  def initialize
    @tasks = []
  end

  def add_task(delay, func)
    @tasks.push( Task.new(delay, func) )
  end

  def get_tasks
    return @tasks
  end

  def start
    loop do
      for task in get_tasks do
        if Time.now.to_i > task.last
          task.func.call
          task.last = Time.now.to_i + task.delay
        end
      end
      sleep(0.1)
    end
  end
end


class Counter
  def initialize(&func)
    @func = func
    @count = 1
  end
  
  def call
    @func.call(@count)
    @count += 1
  end
end


if $0 == __FILE__ then

  def foo_func(num)
    puts "foo(%d)" % num
  end

  def bar_func(num)
    puts "bar(#{num})"
  end

  scheduler = Scheduler.new
  scheduler.add_task(1, Counter.new(&Proc.new{|num| foo_func(num)}))
  scheduler.add_task(5, Counter.new(&Proc.new{|num| bar_func(num)}))
  scheduler.start

end



syntax highlighted by Code2HTML, v. 0.9.1