1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
|
# frozen_string_literal: true
module Delayer
class DelayedProcedure
include Comparable
attr_reader :state, :delayer, :reserve_at
def initialize(delayer, delay:, &proc)
@delayer = delayer
@proc = proc
case delay
when Time
@reserve_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + delay.to_f - Time.now.to_f
else
@reserve_at = Process.clock_gettime(Process::CLOCK_MONOTONIC) + delay.to_f
end
@cancel = false
@procedure = nil
@delayer.class.reserve(self)
end
def register
if !canceled?
@procedure = Procedure.new(@delayer, &@proc)
end
self
end
def <=>(other)
@reserve_at <=> other.reserve_at
end
# Cancel this job
# ==== Exception
# Delayer::TooLate :: if already called run()
# ==== Return
# self
def cancel
@procedure&.cancel
@cancel = true
self
end
# Return true if canceled this task
# ==== Return
# true if canceled this task
def canceled?
procedure = @procedure
if procedure
procedure.canceled?
else
@cancel
end
end
end
end
|