class Alchemist::Measurement

Attributes

exponent[R]
prefix[R]
unprefixed_unit_name[R]
value[R]

Public Class Methods

new(value, unit_name, exponent = 1.0, options = {}) click to toggle source
# File lib/alchemist/measurement.rb, line 10
def initialize value, unit_name, exponent = 1.0, options = {}
  @value = value.to_f
  @unprefixed_unit_name = unit_name.to_sym
  @exponent = exponent
  @prefix = options[:prefix] || ""
end

Public Instance Methods

*(multiplicand) click to toggle source
# File lib/alchemist/measurement.rb, line 57
def * multiplicand
  if multiplicand.is_a?(Numeric)
    remeasure(value * multiplicand)
  else
    try_raising_dimension(multiplicand)
  end
end
+(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 33
def + measurement
  ensure_shared_type!(measurement)
  converted = measurement.to(unit_name)
  addend = converted.value / exponent
  remeasure(value + addend)
end
-(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 40
def - measurement
  ensure_shared_type!(measurement)
  converted = measurement.to(unit_name)
  subtrahend = converted.value / exponent
  remeasure(value - subtrahend)
end
/(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 47
def / measurement
  converted = remeasure(value / dividend(measurement))

  if measurement.is_a?(Measurement)
    converted.value
  else
    converted
  end
end
<=>(other) click to toggle source
# File lib/alchemist/measurement.rb, line 82
def <=> other
  to_f <=> other.to(unit_name).to_f
end
==(other) click to toggle source
# File lib/alchemist/measurement.rb, line 86
def == other
  to_f <=> other.to(unit_name).to_f
end
base(unit_type) click to toggle source
# File lib/alchemist/measurement.rb, line 65
def base unit_type
  conversion_base = conversion_base_for(unit_type)
  convert_to_base(conversion_base)
end
ceil(*args) click to toggle source
# File lib/alchemist/measurement.rb, line 106
def ceil(*args)
  remeasure(value.ceil(*args))
end
coerce(number) click to toggle source
# File lib/alchemist/measurement.rb, line 98
def coerce(number)
  [self, number]
end
floor(*args) click to toggle source
# File lib/alchemist/measurement.rb, line 110
def floor(*args)
  remeasure(value.floor(*args))
end
geospatial() click to toggle source
# File lib/alchemist/geospatial.rb, line 5
def geospatial
  Alchemist::Earth.new(self).geospatial
end
per() click to toggle source
# File lib/alchemist/measurement.rb, line 21
def per
  CompoundMeasurement.new self
end
round(*args) click to toggle source
# File lib/alchemist/measurement.rb, line 102
def round(*args)
  remeasure(value.round(*args))
end
shared_types(other_unit_name) click to toggle source
# File lib/alchemist/measurement.rb, line 94
def shared_types other_unit_name
  types & library.measurement_for(other_unit_name)
end
to(type = nil) click to toggle source
# File lib/alchemist/measurement.rb, line 25
def to type = nil
  if type
    convertor.send(type, exponent)
  else
    convertor
  end
end
to_f() click to toggle source
# File lib/alchemist/measurement.rb, line 78
def to_f
  (precise_value * exponent).to_f
end
to_i() click to toggle source
# File lib/alchemist/measurement.rb, line 74
def to_i
  to_f.to_i
end
to_s() click to toggle source
# File lib/alchemist/measurement.rb, line 70
def to_s
  to_f.to_s
end
types() click to toggle source
# File lib/alchemist/measurement.rb, line 90
def types
  library.measurement_for(unprefixed_unit_name)
end
unit_name() click to toggle source
# File lib/alchemist/measurement.rb, line 17
def unit_name
  "#{prefix}#{unprefixed_unit_name}"
end

Private Instance Methods

conversion_base_for(unit_type) click to toggle source
# File lib/alchemist/measurement.rb, line 147
def conversion_base_for unit_type
  library.conversion_base_for(unit_type, unprefixed_unit_name)
end
convert_to_base(conversion_base) click to toggle source
# File lib/alchemist/measurement.rb, line 139
def convert_to_base conversion_base
  if conversion_base.is_a?(Array)
    exponent * conversion_base.first.call(value)
  else
    precise_value * conversion_base * exponent
  end
end
convertor() click to toggle source
# File lib/alchemist/measurement.rb, line 165
def convertor
  MeasurementConvertor.new(self)
end
dividend(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 116
def dividend measurement
  if measurement.is_a?(Measurement)
    ensure_shared_type!(measurement)
    measurement.to(unit_name).to_f / exponent
  else
    measurement
  end
end
ensure_shared_type!(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 133
def ensure_shared_type! measurement
  if !has_shared_types?(measurement.unprefixed_unit_name)
    incompatible_type_error
  end
end
has_shared_types?(other_unit_name) click to toggle source
# File lib/alchemist/measurement.rb, line 151
def has_shared_types? other_unit_name
  shared_types(other_unit_name).length > 0
end
incompatible_type_error() click to toggle source
# File lib/alchemist/measurement.rb, line 175
def incompatible_type_error
  raise IncompatibleTypeError, "Incompatible Types"
end
library() click to toggle source
# File lib/alchemist/measurement.rb, line 129
def library
  Alchemist.library
end
precise_value() click to toggle source
# File lib/alchemist/measurement.rb, line 169
def precise_value
  BigDecimal(@value.to_s)
end
remeasure(value) click to toggle source
# File lib/alchemist/measurement.rb, line 125
def remeasure value
  Measurement.new(value, unit_name, exponent)
end
try_raising_dimension(measurement) click to toggle source
# File lib/alchemist/measurement.rb, line 155
def try_raising_dimension(measurement)
  valid_types = shared_types(measurement.unit_name)
  library.operator_actions[:*].each do |s1, s2, new_type|
    if (valid_types & [s1, s2]).any?
      return Alchemist.measure(value * measurement.to_f, new_type)
    end
  end
  incompatible_type_error
end