async_paginate 0.1.0 → 0.1.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/async_paginate.rb +43 -0
- metadata +3 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: fd1cb7b2770282220c49fd0725a6e9fb9293f2d5b822f18628b4a65f763e93f7
|
4
|
+
data.tar.gz: b75b5726c35fcec7e32260f74a5bc1c597fa9e1278d7a76fba724274196f0f23
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 75c4871fb38f5c97ad038a5a9899d20c63607c77185d8b2bd0c1dfe1e6283ecec0a7b93c0b154213be6eabc488c12ebfa041de2d410bbabd40ea5b6f416dc61c
|
7
|
+
data.tar.gz: f7a7379e4f8eb806d2127efca1fe01f655815f92674794d3f01c8f3caec0f1946e9ddaf056b5a9ee53fbe89750c8359eb93b39a4baf7d0e5fdeb046afdabd8dc
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "async_paginate/version"
|
4
|
+
require 'async'
|
5
|
+
require 'async/barrier'
|
6
|
+
require 'async/semaphore'
|
7
|
+
|
8
|
+
module AsyncPaginate
|
9
|
+
|
10
|
+
def async_paginate(concurrency, page_fetch_lambda)
|
11
|
+
barrier = Async::Barrier.new
|
12
|
+
semaphore = Async::Semaphore.new(concurrency, parent: barrier)
|
13
|
+
page = 1
|
14
|
+
|
15
|
+
first_page_result = page_fetch_lambda.call(page)
|
16
|
+
total_pages = first_page_result[:page_count]
|
17
|
+
page_results = [ first_page_result[:payloads] ]
|
18
|
+
return page_results if total_pages <= 1
|
19
|
+
Sync do
|
20
|
+
(2..total_pages).each do |page|
|
21
|
+
semaphore.async(parent: barrier) do
|
22
|
+
page_fetch_lambda.call(page)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
tasks = barrier.tasks.to_a.map(&:task)
|
27
|
+
page_results.concat(wait_for_results(tasks))
|
28
|
+
barrier.stop
|
29
|
+
page_results.flatten
|
30
|
+
end
|
31
|
+
|
32
|
+
def wait_for_results(tasks)
|
33
|
+
task_results = []
|
34
|
+
tasks.each do |task|
|
35
|
+
task.wait
|
36
|
+
task_results << task.result[:payloads]
|
37
|
+
end
|
38
|
+
task_results
|
39
|
+
end
|
40
|
+
|
41
|
+
end
|
42
|
+
|
43
|
+
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: async_paginate
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- mac tichner
|
@@ -33,7 +33,8 @@ email:
|
|
33
33
|
executables: []
|
34
34
|
extensions: []
|
35
35
|
extra_rdoc_files: []
|
36
|
-
files:
|
36
|
+
files:
|
37
|
+
- lib/async_paginate.rb
|
37
38
|
homepage: ''
|
38
39
|
licenses:
|
39
40
|
- MIT
|