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