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 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