lib/timers.rb in timers-1.0.0.pre vs lib/timers.rb in timers-1.0.0.pre2

- old
+ new

@@ -1,13 +1,13 @@ require 'set' require 'timers/version' # Low precision timers implemented in pure Ruby class Timers - extend Forwardable include Enumerable - def_delegators :@timers, :add, :delete, :each, :empty? + extend Forwardable + def_delegators :@timers, :delete, :each, :empty? def initialize @timers = SortedSet.new end @@ -32,32 +32,37 @@ def wait_interval @timers.first.time - Time.now unless empty? end # Fire all timers that are ready - def fire + def fire(now = Time.now) return if @timers.empty? - time = Time.now + 0.001 + time = now + 0.001 while not empty? and time >= @timers.first.time timer = @timers.first @timers.delete timer - timer.call + timer.fire(now) end end - alias_method :insert, :add + def add(timer) + raise TypeError, "not a Timers::Timer" unless timer.is_a? Timers::Timer + @timers.add(timer) + end + alias_method :cancel, :delete # An individual timer set to fire a given proc at a given time class Timer include Comparable attr_reader :interval, :time, :recurring def initialize(timers, interval, recurring = false, &block) @timers, @interval, @recurring = timers, interval, recurring @block = block + @time = nil reset end def <=>(other) @@ -68,18 +73,18 @@ def cancel @timers.cancel self end # Reset this timer - def reset - @timers.cancel self if defined?(@time) - @time = Time.now + @interval - @timers.insert self + def reset(now = Time.now) + @timers.cancel self if @time + @time = now + @interval + @timers.add self end # Fire the block - def fire - reset if recurring + def fire(now = Time.now) + reset(now) if recurring @block.call end alias_method :call, :fire end end