class PageUp::Fragment

Constants

NullResult

Attributes

size[R]

Public Class Methods

new(fragment, page, per_page, total = nil) click to toggle source
# File lib/page_up/fragment.rb, line 5
def initialize fragment, page, per_page, total = nil
  @page     = page
  @per_page = per_page
  @size     = total || (fragment.size + offset)
  @fragment = [].fill(NullResult, 0, offset) + fragment
end

Public Instance Methods

[](range) click to toggle source
# File lib/page_up/fragment.rb, line 13
def [] range
  until covers? range
    next_page = page_for(range)
    result = @callback.call next_page, @per_page
    @per_page.times do |index|
      value = result[index]
      @fragment[index + offset(next_page)] = value
    end
  end
  @fragment[range].compact
end
to_a() click to toggle source
# File lib/page_up/fragment.rb, line 25
def to_a
  self[0..@size].to_a
end
use(&block) click to toggle source
# File lib/page_up/fragment.rb, line 29
def use &block
  @callback = block
end

Private Instance Methods

covers?(range) click to toggle source
# File lib/page_up/fragment.rb, line 44
def covers? range
  !range.any? { |index| @fragment.fetch(index,NullResult) == NullResult }
end
offset(page = @page) click to toggle source
# File lib/page_up/fragment.rb, line 40
def offset page = @page
  (page - 1) * @per_page
end
page_for(range) click to toggle source
# File lib/page_up/fragment.rb, line 35
def page_for range
  first_null = range.find { |index| @fragment.fetch(index,NullResult) == NullResult } || range.end + 1
  (first_null / @per_page) + 1
end