class Alchemist::CompoundMeasurement

Attributes

coefficient[R]
denominators[RW]
numerators[RW]

Public Class Methods

new(numerator) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 6
def initialize(numerator)
  @coefficient = numerator.value
  @numerators = [numerator / @coefficient]
  @denominators = []
end

Public Instance Methods

*(value) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 20
def *(value)
  case value
  when Numeric
     @coefficient *= value
     self
  when Alchemist::Measurement
    @numerators << value
    return consolidate
  end
end
<=>(other) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 12
def <=> other
  if @coefficient == other.coefficient
    [@numerators, @denominators] <=> [other.numerators, other.denominators]
  else
    @coefficient <=> other.coefficient
  end
end

Private Instance Methods

compress_units() click to toggle source
# File lib/alchemist/compound_measurement.rb, line 38
def compress_units
  @numerators.each_with_index do |numerator, n|
    @denominators.each_with_index do |denominator, d|
      remove_excess_units(numerator, n, denominator, d)
    end
  end
end
consolidate() click to toggle source
# File lib/alchemist/compound_measurement.rb, line 33
def consolidate
  compress_units
  set_coefficients
end
method_missing(method, *attrs, &block) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 69
def method_missing(method, *attrs, &block)
  if Alchemist.library.measurement_for(method)
    @denominators << Alchemist.measure(1, method)
    consolidate
  end
end
remove_excess_units(numerator, n, denominator, d) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 46
def remove_excess_units numerator, n, denominator, d
  if should_remove_units? numerator, denominator
    @numerators.delete_at(n)
    @denominators.delete_at(d)
    @coefficient *= (numerator / denominator)
  end
end
set_coefficients() click to toggle source
# File lib/alchemist/compound_measurement.rb, line 59
def set_coefficients
  if @denominators.length == 0 && @numerators.length == 1
    @numerators[0] * @coefficient
  elsif @denominators.length == 0 && @numerators.length == 0
    @coefficient
  else
    self
  end
end
should_remove_units?(numerator, denominator) click to toggle source
# File lib/alchemist/compound_measurement.rb, line 54
def should_remove_units? numerator, denominator
  return false if numerator.is_a?(Numeric) || denominator.is_a?(Numeric)
  (Alchemist.library.measurement_for(numerator.unit_name) & Alchemist.library.measurement_for(denominator.unit_name)).length > 0
end