module Pagy::GearboxExtra

def setup_items_var

Setup @items based on the :gearbox_items variable
def setup_items_var
  return super if !@vars[:gearbox_extra] || @vars[:items_extra]
  gearbox_items = @vars[:gearbox_items]
  raise VariableError.new(self, :gearbox_items, 'to be an Array of positives', gearbox_items) \
        unless gearbox_items.is_a?(Array) && gearbox_items.all? { |num| num.positive? rescue false } # rubocop:disable Style/RescueModifier
  @items = gearbox_items[@page - 1] || gearbox_items.last
end

def setup_offset_var

Setup @offset based on the :gearbox_items variable
def setup_offset_var
  return super if !@vars[:gearbox_extra] || @vars[:items_extra]
  gearbox_items = @vars[:gearbox_items]
  @offset       = if @page <= gearbox_items.count
                    gearbox_items[0, @page - 1].sum
                  else
                    gearbox_items.sum + (gearbox_items.last * (@page - gearbox_items.count - 1))
                  end + @outset
end

def setup_pages_var

Setup @pages and @last based on the :gearbox_items variable (not used by Pagy::Countless)
def setup_pages_var
  return super if !@vars[:gearbox_extra] || @vars[:items_extra]
  gearbox_items = @vars[:gearbox_items]
  # This algorithm is thousands of times faster than the one in the geared_pagination gem
  @pages = @last = (if @count > (sum = gearbox_items.sum)
                      [((@count - sum).to_f / gearbox_items.last).ceil, 1].max + gearbox_items.count
                    else
                      pages     = 0
                      remainder = @count
                      while remainder.positive?
                        pages     += 1
                        remainder -= gearbox_items[pages - 1]
                      end
                      [pages, 1].max
                    end)
end