Sha256: eb05829701de093dbe62eb7746f1e91aac0960fc0cb19c1b539136918d3dd11d

Contents?: true

Size: 1.42 KB

Versions: 1

Compression:

Stored size: 1.42 KB

Contents

module Paginator

  class Pager
    include Enumerable

    attr_reader :per_page, :count

    # Instantiate a new Paginator object
    #
    # Provide:
    # * A total count of the number of objects to paginate
    # * The number of objects in each page
    # * A block that returns the array of items
    #   * The block is passed the item offset
    #     (and the number of items to show per page, for
    #     convenience, if the arity is 2)
    def initialize(count, per_page, &select)
      @count, @per_page = count, per_page
      unless select
        raise MissingSelectError, "Must provide block to select data for each page"
      end
      @select = select
    end

    # Total number of pages
    def number_of_pages
      (@count / @per_page).to_i + (@count % @per_page > 0 ? 1 : 0)
    end

    # First page object
    def first
      page 1
    end

    # Last page object
    def last
      page number_of_pages
    end

    def each(&block)
      return enum_for(:each) unless block_given?
      1.upto(number_of_pages) do |number|
        yield page(number)
      end
    end

    # Retrieve page object by number
    def page(number)
      number = (n = number.to_i) > 0 ? n : 1
      Page.new(self, number, lambda {
                 offset = (number - 1) * @per_page
                 args = [offset]
                 args << @per_page if @select.arity == 2
                 @select.call(*args)
               })
    end
  end

end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
paginator-1.2.0 lib/paginator/pager.rb