Module: AsyncPaginate

Defined in:
lib/async_paginate.rb,
lib/async_paginate/version.rb

Constant Summary collapse

VERSION =
"0.1.3"

Instance Method Summary collapse

Instance Method Details

#async_paginate(concurrency, page_fetch_lambda) ⇒ Object



10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/async_paginate.rb', line 10

def async_paginate(concurrency, page_fetch_lambda)
  barrier = Async::Barrier.new
  semaphore = Async::Semaphore.new(concurrency, parent: barrier)
  page = 1

  first_page_result = page_fetch_lambda.call(page)
  total_pages = first_page_result[:page_count]
  page_results = [ first_page_result[:payloads] ]
  return page_results if total_pages <= 1
  Sync do
    (2..total_pages).each do |page|
      semaphore.async(parent: barrier) do
        page_fetch_lambda.call(page)
      end
    end
  end
  tasks = barrier.tasks.to_a.map(&:task)
  page_results.concat(wait_for_results(tasks))
  barrier.stop
  page_results.flatten
end

#wait_for_results(tasks) ⇒ Object



32
33
34
35
36
37
38
39
# File 'lib/async_paginate.rb', line 32

def wait_for_results(tasks)
  task_results = []
  tasks.each do |task|
    task.wait
    task_results << task.result[:payloads]
  end
  task_results
end