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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/async_paginate.rb +43 -0
  3. metadata +3 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f50a85b6f7e8da6ce4cf4c45b2f0ecb61f672f6b08e32b4c901737e2d8edf807
4
- data.tar.gz: f8310b9293c7e1a329b7c25bda3cde40ffa2c59259a7a271c6f0462ac45b594e
3
+ metadata.gz: fd1cb7b2770282220c49fd0725a6e9fb9293f2d5b822f18628b4a65f763e93f7
4
+ data.tar.gz: b75b5726c35fcec7e32260f74a5bc1c597fa9e1278d7a76fba724274196f0f23
5
5
  SHA512:
6
- metadata.gz: f9422ffd267223b30acaad5812bbb92e75df7494fb52e9a7771268a8516a47e096b92ed21b5a5394e28fdf4c9723405b47636f77d5f203c5221eed21179d5b42
7
- data.tar.gz: fadd6c538562e12e9b6511fc88bf671b88c103b5dac55498bff39b7c0126849033197a25aa768d7788a65170ff0bf199650af4b6843b1367b7d62d613f56a97e
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.0
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