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
|
# -*- coding: utf-8 -*-
require "delayer"
require "delayer/deferred/deferredable/awaitable"
class Thread
include ::Delayer::Deferred::Deferredable::Awaitable
def self.delayer
Delayer
end
# このDeferredが成功した場合の処理を追加する。
# 新しいDeferredのインスタンスを返す。
# このメソッドはスレッドセーフです。
# TODO: procが空のとき例外を発生させる
def next(name: caller_locations(1,1).first.to_s, &proc)
add_child(Delayer::Deferred::Chain::Next.new(&proc), name: name)
end
alias deferred next
# このDeferredが失敗した場合の処理を追加する。
# 新しいDeferredのインスタンスを返す。
# このメソッドはスレッドセーフです。
# TODO: procが空のとき例外を発生させる
def trap(name: caller_locations(1,1).first.to_s, &proc)
add_child(Delayer::Deferred::Chain::Trap.new(&proc), name: name)
end
alias error trap
def add_child(chainable, name: caller_locations(1,1).first.to_s)
__gen_promise(name).add_child(chainable)
end
private
def __gen_promise(name)
promise = self.class.delayer.Promise.new(true, name: name)
Thread.new(self) do |tt|
__promise_callback(tt, promise)
end
promise
end
def __promise_callback(tt, promise)
begin
result = tt.value
self.class.delayer.new do
promise.call(result)
end
rescue Exception => err
self.class.delayer.new do
promise.fail(err)
end
end
end
end
|