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
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
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