class Measured::UnitSystem

Attributes

conversion_table[R]
unit_name_to_unit[R]
unit_names[R]
unit_names_with_aliases[R]
units[R]

Public Class Methods

new(units, cache: nil) click to toggle source
# File lib/measured/unit_system.rb, line 5
def initialize(units, cache: nil)
  @units = units.map { |unit| unit.with(unit_system: self) }
  @units = @units.map do |unit|
    next unit unless unit.conversion_unit
    conversion_unit = @units.find { |u| u.names.include?(unit.conversion_unit) }
    next unit unless conversion_unit
    unit.with(value: [unit.conversion_amount, conversion_unit.name])
  end
  @unit_names = @units.map(&:name).sort.freeze
  @unit_names_with_aliases = @units.flat_map(&:names).sort.freeze
  @unit_name_to_unit = @units.each_with_object({}) do |unit, hash|
    unit.names.each { |name| hash[name.to_s] = unit }
  end
  @conversion_table_builder = Measured::ConversionTableBuilder.new(@units, cache: cache)
  @conversion_table = @conversion_table_builder.to_h.freeze
end

Public Instance Methods

cached?() click to toggle source
# File lib/measured/unit_system.rb, line 53
def cached?
  @conversion_table_builder.cached?
end
convert(value, from:, to:) click to toggle source
# File lib/measured/unit_system.rb, line 41
def convert(value, from:, to:)
  conversion = conversion_table.fetch(from.name, {})[to.name]

  raise Measured::UnitError, "Cannot find conversion entry from #{from} to #{to}" unless conversion

  value.to_r * conversion
end
unit?(name) click to toggle source
# File lib/measured/unit_system.rb, line 26
def unit?(name)
  unit = unit_for(name)
  unit ? unit.name == name.to_s : false
end
unit_for(name) click to toggle source
# File lib/measured/unit_system.rb, line 31
def unit_for(name)
  unit_name_to_unit[name.to_s]
end
unit_for!(name) click to toggle source
# File lib/measured/unit_system.rb, line 35
def unit_for!(name)
  unit = unit_for(name)
  raise Measured::UnitError, "Unit '#{name}' does not exist" unless unit
  unit
end
unit_or_alias?(name) click to toggle source
# File lib/measured/unit_system.rb, line 22
def unit_or_alias?(name)
  !!unit_for(name)
end
update_cache() click to toggle source
# File lib/measured/unit_system.rb, line 49
def update_cache
  @conversion_table_builder.update_cache
end