class ReeNumber::NumberToHumanSize

def call(number, **opts)

def call(number, **opts)
  options = DEFAULTS.merge(opts)
  number = Float(number)
  if smaller_than_base?(number)
    number_to_format = number.to_i.to_s
  else
    human_size = number / (BASE**exponent(number))
    number_to_format = number_to_rounded(
      human_size,
      **slice(
        options,
        [:precision, :significant, :strip_insignificant_zeros, :round_mode]
      )
    )
  end
  storage_unit_key = storage_unit_key(number)
  unit = unit(options[:locale], storage_unit_key, number)
  result_number = options[:format]
    .gsub("%n", number_to_format)
    .gsub("%u", unit)
  number_to_delimited(
    result_number,
    **slice(options, [:separator, :delimiter])
  )
end

def exponent(number)

def exponent(number)
  max = STORAGE_UNITS.size - 1
  exp = (Math.log(number) / Math.log(BASE)).to_i
  exp = max if exp > max
  exp
end

def smaller_than_base?(number)

def smaller_than_base?(number)
  number.to_i < BASE
end

def storage_unit_key(number)

def storage_unit_key(number)
  key_end = smaller_than_base?(number) ? "byte" : STORAGE_UNITS[exponent(number)]
  "human.sizes.#{key_end}"
end

def unit(locale, storage_unit_key, number)

def unit(locale, storage_unit_key, number)
  t(
    storage_unit_key,
    locale: locale,
    count: number.to_i,
    raise: true,
    default_by_locale: :en
  )
end