class Pagy

def initialize(vars)

Merge and validate the options, do some simple arithmetic and set the instance variables
def initialize(vars)
  @vars = VARS.merge(vars.delete_if{|_,v| v.nil? || v == '' })               # default vars + cleaned vars
  { count:0, items:1, outset:0, page:1 }.each do |k,min|                     # validate instance variables
    (@vars[k] && instance_variable_set(:"@#{k}", @vars[k].to_i) >= min) \
       or raise(VariableError.new(self), "expected :#{k} >= #{min}; got #{@vars[k].inspect}")
  end
  @pages = @last = [(@count.to_f / @items).ceil, 1].max                      # cardinal and ordinal meanings
  @page <= @last or raise(OverflowError.new(self), "expected :page in 1..#{@last}; got #{@page.inspect}")
  @offset = @items * (@page - 1) + @outset                                   # pagination offset + outset (initial offset)
  @items  = @count - ((@pages-1) * @items) if @page == @last && @count > 0   # adjust items for last non-empty page
  @from   = @count == 0 ? 0 : @offset+1 - @outset                            # page begins from item
  @to     = @count == 0 ? 0 : @offset + @items - @outset                     # page ends to item
  @prev   = (@page-1 unless @page == 1)                                      # nil if no prev page
  @next   = @page == @last ? (1 if @vars[:cycle]) : @page+1                  # nil if no next page, 1 if :cycle
end