opal-async 1.1.1 → 1.2.0
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/CHANGELOG.md +4 -0
- data/README.md +34 -4
- data/VERSION +1 -1
- data/opal/async/ext.rb +2 -0
- data/opal/async/ext/array.rb +25 -0
- data/opal/async/task.rb +20 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e4ac70e28d27ce5551acbba060dba2956e791e33ab7788673ffd6ebfc08fc35f
|
4
|
+
data.tar.gz: c02be17a79bab91865aa0898afc97a024376bf0c7686dd85854193fd4174516a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1cd290ff3f7b6173e7d6cf6440bca1819e53294a2a7859a016bf0e2632cc7b43b5a18f5563d21be0b755e7018cf5449f5f1e6e18a3217a44d950d580cd4eac57
|
7
|
+
data.tar.gz: 0bc9487d71ce6343d0b708c56c6878bb445390db5043a5972221723ffec12059286f03486424f0b480441a46bb4d9af0407028444f0a119a2dd3b566031ba7e7
|
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
|
6
6
|
Add this line to your application's Gemfile:
|
7
7
|
|
8
|
-
gem 'opal-async', '~> 1.
|
8
|
+
gem 'opal-async', '~> 1.2.0'
|
9
9
|
|
10
10
|
And then execute:
|
11
11
|
|
@@ -161,21 +161,51 @@ Async::Interval.new 3000 do
|
|
161
161
|
end
|
162
162
|
```
|
163
163
|
|
164
|
-
###
|
164
|
+
### Ruby Extensions
|
165
|
+
|
166
|
+
[opal-async](https://rubygems.org/gems/opal-async) ships with some Opal Ruby extensions that enhance Ruby classes with asynchronous capabilities.
|
167
|
+
|
168
|
+
You may activate all the Ruby extensions via this require statement:
|
169
|
+
|
170
|
+
```ruby
|
171
|
+
require 'async/ext'
|
172
|
+
```
|
173
|
+
|
174
|
+
#### Thread
|
165
175
|
|
166
176
|
You may use the `Async::Task` class as a `Thread` class in Opal to perform asynchronous work with an extra `require` statement.
|
167
177
|
|
168
178
|
```ruby
|
169
|
-
require 'async/ext/thread'
|
179
|
+
require 'async/ext/thread' # not needed if you called `require 'async/ext'`
|
170
180
|
|
171
181
|
Thread.new do
|
172
182
|
puts "hello world"
|
173
183
|
end
|
174
184
|
```
|
175
185
|
|
186
|
+
#### Array
|
187
|
+
|
188
|
+
`Array#cycle` has been amended to work asynchronously via `Async::Task` when triggered inside another `Async::Task` (auto-detects it)
|
189
|
+
|
190
|
+
This makes it not block the web browser event loop, thus allowing other tasks to update the DOM unhindered while `Array#cycle` is running.
|
191
|
+
|
192
|
+
```ruby
|
193
|
+
require 'async/ext/array' # not needed if you called `require 'async/ext'`
|
194
|
+
|
195
|
+
Async::Task.new do
|
196
|
+
[1,2,3,4].cycle do |n|
|
197
|
+
puts n
|
198
|
+
Async::Task.new do
|
199
|
+
# make a DOM update
|
200
|
+
end
|
201
|
+
sleep(1) # this does not block the event loop since it is transparently happening inside an Async::Task
|
202
|
+
end
|
203
|
+
end
|
204
|
+
```
|
205
|
+
|
176
206
|
## In The Wild
|
177
207
|
|
178
|
-
opal-async is currently used in
|
208
|
+
opal-async is currently used in:
|
179
209
|
- [Glimmer DSL for Opal](https://github.com/AndyObtiva/glimmer-dsl-opal)
|
180
210
|
|
181
211
|
## Change Log
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
1.
|
1
|
+
1.2.0
|
data/opal/async/ext.rb
ADDED
@@ -0,0 +1,25 @@
|
|
1
|
+
require 'async/task'
|
2
|
+
|
3
|
+
class Array
|
4
|
+
alias cycle_without_opal_async cycle
|
5
|
+
def cycle(n=nil, &block)
|
6
|
+
if Async::Task.started? && block_given?
|
7
|
+
array = self * n unless n.nil?
|
8
|
+
index = 0
|
9
|
+
looper = lambda do
|
10
|
+
if n.nil?
|
11
|
+
block.call(self[index])
|
12
|
+
index += 1
|
13
|
+
index = index % self.size
|
14
|
+
Async::Task.new(&looper)
|
15
|
+
else
|
16
|
+
block.call(array.shift)
|
17
|
+
Async::Task.new(&looper) unless array.empty?
|
18
|
+
end
|
19
|
+
end
|
20
|
+
Async::Task.new(&looper)
|
21
|
+
else
|
22
|
+
cycle_without_opal_async(n, &block)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
data/opal/async/task.rb
CHANGED
@@ -1,5 +1,23 @@
|
|
1
1
|
module Async
|
2
2
|
class Task
|
3
|
+
class << self
|
4
|
+
# returns general status of whether a task is running.
|
5
|
+
# Useful to code running in the task block to determine if it is running
|
6
|
+
# as part of a task or not and take special actions accordingly.
|
7
|
+
def started?
|
8
|
+
@@started = false unless defined? :@@started
|
9
|
+
@@started
|
10
|
+
end
|
11
|
+
|
12
|
+
def start
|
13
|
+
@@started = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def stop
|
17
|
+
@@started = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
3
21
|
attr_accessor :delay, :times
|
4
22
|
def initialize options={}, &block
|
5
23
|
@options = options
|
@@ -15,6 +33,7 @@ module Async
|
|
15
33
|
@delay = @options[:delay] || 0
|
16
34
|
@times = @options[:times]
|
17
35
|
@proc = Proc.new do
|
36
|
+
self.class.start
|
18
37
|
if @times
|
19
38
|
if @times.is_a?(Fixnum)
|
20
39
|
@block.call(@countup, @countdown)
|
@@ -34,6 +53,7 @@ module Async
|
|
34
53
|
@block.call
|
35
54
|
@stopped = true
|
36
55
|
end
|
56
|
+
self.class.stop
|
37
57
|
end
|
38
58
|
end
|
39
59
|
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: opal-async
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Ravenstine
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2020-
|
12
|
+
date: 2020-10-11 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: opal
|
@@ -121,6 +121,8 @@ files:
|
|
121
121
|
- opal/async.rb
|
122
122
|
- opal/async/countdown.rb
|
123
123
|
- opal/async/enumerator.rb
|
124
|
+
- opal/async/ext.rb
|
125
|
+
- opal/async/ext/array.rb
|
124
126
|
- opal/async/ext/thread.rb
|
125
127
|
- opal/async/interval.rb
|
126
128
|
- opal/async/task.rb
|
@@ -150,7 +152,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
152
|
- !ruby/object:Gem::Version
|
151
153
|
version: '0'
|
152
154
|
requirements: []
|
153
|
-
rubygems_version: 3.1.
|
155
|
+
rubygems_version: 3.1.4
|
154
156
|
signing_key:
|
155
157
|
specification_version: 4
|
156
158
|
summary: Provides non-blocking tasks and enumerators for Opal.
|