em_promise.rb 0.0.2 → 0.0.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/em_promise.rb.gemspec +3 -2
- data/lib/em_promise.rb +75 -8
- metadata +17 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 72a70beea8dc08eb215bb38dbc39a2c98f180c8c53367bdf1eb892f1d5fc6c53
|
4
|
+
data.tar.gz: e1bf42f248972e4b5e38bcf9750ffe845020640b6e386da36a5d24bd2b9d0701
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9aedc31b0acf65bd786cdfe364c54f13dbe8ca1f0f952f1ecbf4bdf36278c7c93a70a05df500b2cfa6d1931e80709d027dd3a14a64abc830f9e848cfc86bac3a
|
7
|
+
data.tar.gz: 7d76798c8347bbaa9843c16cea76bfdb21cc63504414b0d93d7c92c65591c0e42ecb382e08bce068c3fbeb6e31b4903ac58425d549aae2eec07f80de52652f4d
|
data/em_promise.rb.gemspec
CHANGED
@@ -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
|
15
|
+
`git ls-files -z`.split("\x00".b).reject { |f|
|
16
16
|
f.start_with?(".", "test/", "scripts/") ||
|
17
17
|
f == "Makefile" || f == "Gemfile"
|
18
|
-
|
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
|
-
|
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
|
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
|
-
|
85
|
+
@trampoline.submit { yield }
|
21
86
|
end
|
22
87
|
|
23
88
|
def wait
|
24
89
|
fiber = Fiber.current
|
25
|
-
resume = proc do
|
26
|
-
|
90
|
+
resume = proc do
|
91
|
+
EM.next_tick { fiber.resume }
|
27
92
|
end
|
28
93
|
|
29
94
|
self.then(resume, resume)
|
30
|
-
|
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.
|
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:
|
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
|
-
|
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
|