Module: Delayer::Deferred::Tools

Included in:
Delayer::Deferred, Deferred
Defined in:
lib/delayer/deferred/tools.rb

Instance Method Summary collapse

Instance Method Details

#fail(value) ⇒ Object

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

Args

value

trap()に渡す値

Throw

:__deferredable_fail をthrowする



18
19
# File 'lib/delayer/deferred/tools.rb', line 18

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

#next(&proc) ⇒ Object



6
7
# File 'lib/delayer/deferred/tools.rb', line 6

def next(&proc)
new.next(&proc) end

#system(*args) ⇒ Object

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

Args

*args

Kernel#system の引数

Return

Deferred



46
47
48
49
50
51
52
53
54
55
# File 'lib/delayer/deferred/tools.rb', line 46

def system(*args)
  delayer.Deferred.Thread.new {
    Process.waitpid2(Kernel.spawn(*args))
  }.next{|_pid, status|
    if status && status.success?
      status
    else
      raise ForeignCommandAborted.new("command aborted: #{args.join(' ')}", process: $?) end
  }
end

#trap(&proc) ⇒ Object



9
10
# File 'lib/delayer/deferred/tools.rb', line 9

def trap(&proc)
new.trap(&proc) end

#when(*args) ⇒ Object

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

Args

*args

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

Return

Deferred

Raises:

  • (TypeError)


28
29
30
31
32
33
34
35
36
37
38
# File 'lib/delayer/deferred/tools.rb', line 28

def when(*args)
      return self.next{[]} if args.empty?
      defer, *follow = args
      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