File: procedure.rb

package info (click to toggle)
ruby-delayer 1.2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 192 kB
  • sloc: ruby: 947; makefile: 3; sh: 2
file content (64 lines) | stat: -rw-r--r-- 1,280 bytes parent folder | download | duplicates (2)
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