Sha256: da8882a0843d8662ccbc1e970a3925618adaeb0241825179599fdd7782b1b7fa

Contents?: true

Size: 1.65 KB

Versions: 9

Compression:

Stored size: 1.65 KB

Contents

# frozen_string_literal: true
class Measured::UnitSystem
  attr_reader :units, :unit_names, :unit_names_with_aliases

  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

  def unit_or_alias?(name)
    !!unit_for(name)
  end

  def unit?(name)
    unit = unit_for(name)
    unit ? unit.name == name.to_s : false
  end

  def unit_for(name)
    unit_name_to_unit[name.to_s]
  end

  def unit_for!(name)
    unit = unit_for(name)
    raise Measured::UnitError, "Unit '#{name}' does not exist" unless unit
    unit
  end

  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

  def update_cache
    @conversion_table_builder.update_cache
  end

  def cached?
    @conversion_table_builder.cached?
  end

  protected

  attr_reader :unit_name_to_unit, :conversion_table
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
measured-3.1.0 lib/measured/unit_system.rb
measured-3.0.0 lib/measured/unit_system.rb
measured-2.8.2 lib/measured/unit_system.rb
measured-2.8.1 lib/measured/unit_system.rb
measured-2.8.0 lib/measured/unit_system.rb
measured-2.7.1 lib/measured/unit_system.rb
measured-2.7.0 lib/measured/unit_system.rb
measured-2.6.0 lib/measured/unit_system.rb
measured-2.5.2 lib/measured/unit_system.rb