File: thread.rb

package info (click to toggle)
ruby-delayer-deferred 2.2.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, forky, sid, trixie
  • size: 308 kB
  • sloc: ruby: 1,650; sh: 4; makefile: 2
file content (57 lines) | stat: -rw-r--r-- 1,544 bytes parent folder | download | duplicates (2)
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