class Pagy
def initialize(vars)
def initialize(vars) @vars = VARS.merge(vars) # default vars + instance vars @vars[:page] = (@vars[:page]||1).to_i # set page to 1 if nil { count:0, items:1, outset:0, page:1 }.each do |k,min| # validate core variables @vars[k] >= min rescue nil || raise(ArgumentError, "expected :#{k} >= #{min}; got #{@vars[k].inspect}") instance_variable_set(:"@#{k}", @vars.delete(k)) # set instance variables end @pages = @last = [(@count.to_f / @items).ceil, 1].max # cardinal and ordinal meanings (1..@last).cover?(@page) || raise(OutOfRangeError, "expected :page in 1..#{@last}; got #{@page.inspect}") @offset = @items * (@page - 1) + @outset # pagination offset + outset (initial offset) @items = @count % @items if @page == @last # adjust items for last page @from = @count == 0 ? 0 : @offset+1 - @outset # page begins from item @to = @offset + @items - @outset # page ends to item @prev = (@page-1 unless @page == 1) # nil if no prev page @next = (@page+1 unless @page == @last) # nil if no next page end