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 57 58 59 60 61 62 63 64
|
# frozen_string_literal: true
module Delayer
class Procedure
attr_reader :state, :delayer
attr_accessor :next
def initialize(delayer, &proc)
@delayer = delayer
@proc = proc
@state = :stop
@next = nil
@delayer.class.register(self)
end
# Run a process
# ==== Exception
# Delayer::TooLate :: if already called run()
# ==== Return
# node
def run
unless @state == :stop
raise Delayer::StateError(@state), 'call twice Delayer::Procedure'
end
@state = :run
@proc&.call
@state = :done
@proc = nil
end
# Cancel this job
# ==== Exception
# Delayer::TooLate :: if already called run()
# ==== Return
# self
def cancel
unless @state == :stop
raise Delayer::StateError(@state), 'cannot cancel Delayer::Procedure'
end
@state = :cancel
self
end
# Return true if canceled this task
# ==== Return
# true if canceled this task
def canceled?
@state == :cancel
end
# insert node between self and self.next
# ==== Args
# [node] insertion
# ==== Return
# node
def break(node)
tail = @next
@next = node
node.next = tail
node
end
end
end
|