Module: Delayer::Deferred::Deferredable

Included in:
Deferred, Thread
Defined in:
lib/delayer/deferred/deferredable.rb

Overview

なんでもDeferred

Defined Under Namespace

Classes: Callback

Constant Summary collapse

CallbackDefaultOK =
lambda{ |x| x }
CallbackDefaultNG =
lambda{ |err| Delayer::Deferred.fail(err) }

Instance Method Summary collapse

Instance Method Details

#+@Object

self が終了して結果が出るまで呼び出し側のDeferredを停止し、 self の結果を返す。呼び出し側はDeferredブロック内でなければならないが、 _Deferred#next_ を使わずに直接戻り値を得ることが出来る。self が失敗した場合は、呼び出し側のDeferredの直近の trap ブロックが呼ばれる。



35
36
37
38
39
40
41
42
# File 'lib/delayer/deferred/deferredable.rb', line 35

def +@
  interrupt = Fiber.yield(self)
  if interrupt.ok?
    interrupt.value
  else
    Delayer::Deferred.fail(interrupt.value)
  end
end

#call(value = nil) ⇒ Object

Deferredを直ちに実行する



24
25
# File 'lib/delayer/deferred/deferredable.rb', line 24

def call(value = nil)
_call(:ok, value) end

#callbackObject



49
50
51
# File 'lib/delayer/deferred/deferredable.rb', line 49

def callback
    @callback ||= Callback.new(CallbackDefaultOK,
CallbackDefaultNG) end

#cancelObject

この一連のDeferredをこれ以上実行しない



45
46
47
# File 'lib/delayer/deferred/deferredable.rb', line 45

def cancel
    @callback = Callback.new(CallbackDefaultOK,
CallbackDefaultNG).freeze end

#fail(exception = nil) ⇒ Object

Deferredを直ちに失敗させる



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

def fail(exception = nil)
_call(:ng, exception) end

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

このDeferredが成功した場合の処理を追加する。新しいDeferredのインスタンスを返す



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

def next(&proc)
_post(:ok, &proc) end

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

このDeferredが失敗した場合の処理を追加する。新しいDeferredのインスタンスを返す



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

def trap(&proc)
_post(:ng, &proc) end

#wait(second) ⇒ Object

second 秒待って次を実行する

Args

second

待つ秒数(second)

Return

Deferred



58
59
# File 'lib/delayer/deferred/deferredable.rb', line 58

def wait(second)
self.next{ Thread.new{ sleep(second) } } end