class Timers::Events
Maintains a PriorityHeap of events ordered on time, which can be cancelled.
def fire(time)
def fire(time) merge! while handle = @sequence.peek and handle.time <= time @sequence.pop handle.fire(time) end end
def first
def first merge! while (handle = @sequence.peek) return handle unless handle.cancelled? @sequence.pop end end
def flush!
def flush! while @queue.last&.cancelled? @queue.pop end end
def initialize
def initialize # A sequence of handles, maintained in sorted order, future to present. # @sequence.last is the next event to be fired. @sequence = PriorityHeap.new @queue = [] end
def merge!
def merge! while handle = @queue.pop next if handle.cancelled? @sequence.push(handle) end end
def schedule(time, callback)
def schedule(time, callback) flush! handle = Handle.new(time.to_f, callback) @queue << handle return handle end
def size
def size @sequence.size + @queue.size end