Module: Delayer::Deferred

Extended by:
Deferred
Included in:
Deferred
Defined in:
lib/delayer/deferred.rb,
lib/delayer/deferred/version.rb,
lib/delayer/deferred/deferred.rb

Defined Under Namespace

Modules: Deferredable Classes: Deferred

Constant Summary collapse

VERSION =
"1.0.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#debugObject

真ならデバッグ情報を集める



15
16
17
# File 'lib/delayer/deferred.rb', line 15

def debug
  @debug
end

Instance Method Details

#fail(value) ⇒ Object

実行中のDeferredを失敗させる。raiseと違って、Exception以外のオブジェクトをtrap()に渡すことができる。Deferredのnextとtrapの中でだけ呼び出すことができる。

Args

value

trap()に渡す値

Throw

:__deferredable_fail をthrowする



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

def fail(value)
throw(:__deferredable_fail, value) end

#system(*args) ⇒ Object

Kernel#systemを呼び出して、コマンドが成功たら成功するDeferredを返す。失敗した場合、trap{}ブロックには $? の値(Process::Status)か、例外が発生した場合それが渡される

Args

*args

Kernel#system の引数

Return

Deferred



50
51
52
53
54
55
# File 'lib/delayer/deferred.rb', line 50

def system(*args)
      delayer.Deferred.Thread.new do
        if Kernel.system(*args)
$?
        else
delayer.Deferred.fail($?) end end end

#when(defer, *follow) ⇒ Object

複数のdeferredを引数に取って、それら全ての実行が終了したら、その結果を引数の順番通りに格納したArrayを引数に呼ばれるDeferredを返す。引数のDeferredが一つでも失敗するとこのメソッドの返すDeferredも失敗する。

Args

defer

終了を待つDeferredオブジェクト

*follow

他のDeferredオブジェクト

Return

Deferred

Raises:

  • (TypeError)


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

def when(defer, *follow)
      raise TypeError, "Argument of Deferred.when must be Delayer::Deferred::Deferredable" unless defer.is_a? Delayer::Deferred::Deferredable
      if follow.empty?
        defer.next{|res| [res] }
      else
        remain = self.when(*follow)
        defer.next do |res|
          remain.next do |follow_res|
follow_res.unshift(res) end end end end