Sha256: a091e25bd49cda49b3ed375e32fdde1e5223fdfa53338f91389844931ddd53ba

Contents?: true

Size: 1.14 KB

Versions: 1

Compression:

Stored size: 1.14 KB

Contents

require 'active_support/core_ext/string/inflections'

module EyeOfNewt
  class Quantity
    DELTA = 0.01
    SIGNIFICANT_DIGITS = 3

    attr_reader :amount, :unit, :modifier, :units

    def initialize(amount, unit, modifier: nil, units: EyeOfNewt.units)
      @amount = amount
      @units = units
      @unit = units[unit]
      @modifier = modifier
    end

    def in(new_unit)
      rate = units.conversion_rate(unit, new_unit)
      self.class.new(amount * rate, new_unit, units: units)
    end

    def to_s
      [fraction_str, modifier, unit_str].compact.join(' ')
    end
    alias :inspect :to_s

    private

    def fraction_str
      return nil if units.unquantified?(unit)
      whole = fraction.to_i
      fractional = fraction - whole
      [whole, fractional].reject(&:zero?).join(' ')
    end

    def unit_str
      return nil if unit == units.default
      singular = fraction <= 1 && fraction.numerator == 1
      singular ? unit.singularize : unit
    end

    def fraction
      @fraction ||= signif(amount, SIGNIFICANT_DIGITS).to_r.rationalize(DELTA)
    end

    def signif(value, digits)
      Float("%.#{digits}g" % value)
    end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
eye-of-newt-0.0.8 lib/eye_of_newt/quantity.rb