Module: Delayer::Deferred::Deferredable::Chainable

Includes:
Awaitable, Graph, NodeSequence
Included in:
Chain::Base, Trigger
Defined in:
lib/delayer/deferred/deferredable/chainable.rb

Constant Summary

Constants included from NodeSequence

NodeSequence::AWAIT, NodeSequence::AWAIT_C, NodeSequence::BURST_OUT, NodeSequence::CALL_CHILD, NodeSequence::CONNECTED, NodeSequence::FRESH, NodeSequence::GENOCIDE, NodeSequence::GRAFT, NodeSequence::GRAFT_C, NodeSequence::PASS, NodeSequence::PASS_C, NodeSequence::RESERVED, NodeSequence::RESERVED_C, NodeSequence::ROTTEN, NodeSequence::RUN, NodeSequence::RUN_C, NodeSequence::SEQUENCE_LOCK, NodeSequence::STOP, NodeSequence::WAIT

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from NodeSequence

#activated?, #change_sequence, #sequence, #spoiled?

Methods included from Graph

#graph, #graph_child, #graph_draw, #graph_save

Methods included from Awaitable

#[email protected], #enter_await, #exit_await

Instance Attribute Details

#childObject (readonly)

Returns the value of attribute child


12
13
14
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 12

def child
  @child
end

Instance Method Details

#add_awaited(awaitable) ⇒ Object


81
82
83
84
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 81

def add_awaited(awaitable)
  @awaited = [*awaited, awaitable].freeze
  self
end

#add_child(chainable) ⇒ Object

子を追加する。 Delayer::Deferred::Chainable を直接指定できる。通常外部から呼ぶときは nexttrap メソッドを使うこと。 このメソッドはスレッドセーフです。

Args

chainable

子となるDeferred

Return

必ず chainable を返す

Raise

Delayer::Deferred::SequenceError

既に子が存在している場合


52
53
54
55
56
57
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 52

def add_child(chainable)
  change_sequence(:get_child) do
    chainable.parent = self
    @child = chainable
  end
end

#add_child_observer(observer) ⇒ Object

子が追加された時に一度だけコールバックするオブジェクトを登録する。 observerと言っているが、実際には Delayer::Deferred::Worker を渡して利用している。 このメソッドはスレッドセーフです。

Args

observer

pushメソッドを備えているもの。引数に [email protected]_ の値が渡される

Return

self


66
67
68
69
70
71
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 66

def add_child_observer(observer)
  change_sequence(:gaze) do
    @child_observer = observer
  end
  self
end

#awaitedObject


73
74
75
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 73

def awaited
  @awaited ||= [].freeze
end

#cancelObject

この一連のDeferredをこれ以上実行しない。 このメソッドはスレッドセーフです。


34
35
36
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 34

def cancel
  change_sequence(:genocide) unless spoiled?
end

#enter_passObject


91
92
93
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 91

def enter_pass
  change_sequence(:pass)
end

#exit_passObject


95
96
97
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 95

def exit_pass
  change_sequence(:resume)
end

#has_awaited?Boolean

Returns:

  • (Boolean)

77
78
79
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 77

def has_awaited?
  not awaited.empty?
end

#has_child?Boolean

Returns:

  • (Boolean)

38
39
40
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 38

def has_child?
  child ? true : false
end

#next(&proc) ⇒ Object Also known as: deferred

このDeferredが成功した場合の処理を追加する。 新しいDeferredのインスタンスを返す。 このメソッドはスレッドセーフです。 TODO: procが空のとき例外を発生させる


18
19
20
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 18

def next(&proc)
  add_child(Delayer::Deferred::Chain::Next.new(&proc))
end

#reserve_activateObject

activateメソッドを呼ぶDelayerジョブを登録する寸前に呼ばれる。


87
88
89
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 87

def reserve_activate
  change_sequence(:reserve)
end

#trap(&proc) ⇒ Object Also known as: error

このDeferredが失敗した場合の処理を追加する。 新しいDeferredのインスタンスを返す。 このメソッドはスレッドセーフです。 TODO: procが空のとき例外を発生させる


27
28
29
# File 'lib/delayer/deferred/deferredable/chainable.rb', line 27

def trap(&proc)
  add_child(Delayer::Deferred::Chain::Trap.new(&proc))
end