em_promise.rb 0.0.2 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3b9252ef4d1a0e87a58dab94d940c0e007daa57bb29aff67607a53ddd9e49eff
4
- data.tar.gz: c9deea390a562b41346c6b5c6c067d30bb36e8bd71f90cadf7b78928a56be383
3
+ metadata.gz: 72a70beea8dc08eb215bb38dbc39a2c98f180c8c53367bdf1eb892f1d5fc6c53
4
+ data.tar.gz: e1bf42f248972e4b5e38bcf9750ffe845020640b6e386da36a5d24bd2b9d0701
5
5
  SHA512:
6
- metadata.gz: 1cdccfffad92001ced9be4d66298741a1fdf565ce0e2324f9acf53246901f527a9d36d3b26713dcd6128f07df05d7d4a66f762bff4831948b40dba61b3a571b4
7
- data.tar.gz: 0ed5df6e816ae1f221108a5990835e446ac6bc288557131e66baafccf7132ba86881eaa190139e953db5f83e210ceb4d716542b72da4c06ffff89b24a7118647
6
+ metadata.gz: 9aedc31b0acf65bd786cdfe364c54f13dbe8ca1f0f952f1ecbf4bdf36278c7c93a70a05df500b2cfa6d1931e80709d027dd3a14a64abc830f9e848cfc86bac3a
7
+ data.tar.gz: 7d76798c8347bbaa9843c16cea76bfdb21cc63504414b0d93d7c92c65591c0e42ecb382e08bce068c3fbeb6e31b4903ac58425d549aae2eec07f80de52652f4d
@@ -12,11 +12,12 @@ Gem::Specification.new do |spec|
12
12
  spec.homepage = "https://git.singpolyma.net/em_promise.rb"
13
13
 
14
14
  spec.files =
15
- `git ls-files -z`.split("\x00".b).reject do |f|
15
+ `git ls-files -z`.split("\x00".b).reject { |f|
16
16
  f.start_with?(".", "test/", "scripts/") ||
17
17
  f == "Makefile" || f == "Gemfile"
18
- end
18
+ }
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency "eventmachine"
21
22
  spec.add_dependency "promise.rb", "~> 0.7.4"
22
23
  end
data/lib/em_promise.rb CHANGED
@@ -1,15 +1,80 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require "eventmachine"
4
+ require "fiber"
2
5
  require "promise"
3
6
 
4
7
  class EMPromise < Promise
5
- def initialize(deferrable=nil)
8
+ class Trampoline
9
+ attr_accessor :ready
10
+
11
+ class SubmittedBlock
12
+ def initialize(blk)
13
+ @blk = blk
14
+ end
15
+
16
+ def call(*args, **kwargs, &blk)
17
+ @blk.call(*args, **kwargs, &blk)
18
+ end
19
+ end
20
+
21
+ def initialize(&initial_blk)
22
+ @ready = true
23
+ @fiber = Fiber.new { |blk|
24
+ Thread.current[:_em_promise_trampoline] = self
25
+ self.ready = false
26
+ Trampoline.yield(blk.call)
27
+ }
28
+ @fiber.resume(&initial_blk) if initial_blk
29
+ end
30
+
31
+ def submit(&blk)
32
+ EM.next_tick do
33
+ if ready
34
+ @fiber.resume(SubmittedBlock.new(blk))
35
+ else
36
+ submit(&blk)
37
+ end
38
+ end
39
+ end
40
+
41
+ def self.yield(arg=nil)
42
+ tramp = Thread.current[:_em_promise_trampoline]
43
+ raise "Trampoline already ready?" if tramp&.ready
44
+
45
+ loop do
46
+ tramp&.ready = true
47
+ blk = Fiber.yield arg
48
+ tramp&.ready = false
49
+ return arg unless blk.is_a?(SubmittedBlock)
50
+
51
+ arg = blk.call
52
+ end
53
+ end
54
+ end
55
+
56
+ # Make sure that self.class.new inherits the trampoline
57
+ def class
58
+ tramp = @trampoline
59
+ klass = super.dup
60
+ klass.define_singleton_method(:new) do |*args|
61
+ super(*args, trampoline: tramp)
62
+ end
63
+ klass
64
+ end
65
+
66
+ def initialize(deferrable=nil, trampoline: nil)
6
67
  super()
68
+ @trampoline =
69
+ trampoline ||
70
+ Thread.current[:_em_promise_trampoline] ||
71
+ Trampoline.new
7
72
  fulfill(deferrable) if deferrable
8
73
  end
9
74
 
10
- def fulfill(value, bind_defer=true)
75
+ def fulfill(value, bind_defer: true)
11
76
  if bind_defer && value.is_a?(EM::Deferrable)
12
- value.callback { |x| fulfill(x, false) }
77
+ value.callback { |x| fulfill(x, bind_defer: false) }
13
78
  value.errback(&method(:reject))
14
79
  else
15
80
  super(value)
@@ -17,17 +82,19 @@ class EMPromise < Promise
17
82
  end
18
83
 
19
84
  def defer
20
- EM.next_tick { yield }
85
+ @trampoline.submit { yield }
21
86
  end
22
87
 
23
88
  def wait
24
89
  fiber = Fiber.current
25
- resume = proc do |arg|
26
- defer { fiber.resume(arg) }
90
+ resume = proc do
91
+ EM.next_tick { fiber.resume }
27
92
  end
28
93
 
29
94
  self.then(resume, resume)
30
- Fiber.yield
95
+
96
+ # We might be in a trampoline, so keep that going
97
+ Trampoline.yield
31
98
  end
32
99
 
33
100
  def self.reject(e)
@@ -61,7 +128,7 @@ module EventMachine
61
128
  EMPromise.new(self)
62
129
  end
63
130
 
64
- [:then, :rescue, :catch].each do |method|
131
+ [:then, :rescue, :catch, :sync].each do |method|
65
132
  define_method(method) do |*args, &block|
66
133
  promise.public_send(method, *args, &block)
67
134
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: em_promise.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Stephen Paul Weber
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-05-18 00:00:00.000000000 Z
11
+ date: 2022-03-16 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: eventmachine
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: promise.rb
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -54,8 +68,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
54
68
  - !ruby/object:Gem::Version
55
69
  version: '0'
56
70
  requirements: []
57
- rubyforge_project:
58
- rubygems_version: 2.7.6.2
71
+ rubygems_version: 3.2.5
59
72
  signing_key:
60
73
  specification_version: 4
61
74
  summary: promise.rb Promises for EventMachine