class Unitwise::Expression::Composer

Composer creates string expressions for arrays of terms, following UCUM's conventions.

Attributes

mode[R]
terms[R]

Public Class Methods

new(terms, mode) click to toggle source
# File lib/unitwise/expression/composer.rb, line 7
def initialize(terms, mode)
  @terms  = terms
  @mode = mode || :primary_code
end

Public Instance Methods

denominator() click to toggle source
# File lib/unitwise/expression/composer.rb, line 27
def denominator
  @denominator ||= set.select{ |_, v| v < 0 }.map do |k, v|
    "#{ k[:f] if k[:f] != 1 }#{ k[:p] }#{ k[:a] }#{ -v if v != -1 }"
  end.select { |t| !t.empty? }.join('.')
end
expression() click to toggle source
# File lib/unitwise/expression/composer.rb, line 33
def expression
  @expression = []
  @expression << (numerator.empty? ? '1' : numerator)
  (@expression << denominator) unless denominator.empty?
  @expression.join('/')
end
numerator() click to toggle source
# File lib/unitwise/expression/composer.rb, line 21
def numerator
  @numerator ||= set.select{ |_, v| v > 0 }.map do |k, v|
    "#{ k[:f] if k[:f] != 1 }#{ k[:p] }#{ k[:a] }#{ v if v != 1 }"
  end.select { |t| !t.empty? }.join('.')
end
set() click to toggle source
# File lib/unitwise/expression/composer.rb, line 12
def set
  @set ||= terms.reduce(SignedMultiset.new) do |s, t|
    identifier = { :f => t.factor,
                   :p => (t.prefix.to_s(mode) if t.prefix),
                   :a => (t.atom.to_s(mode) if t.atom) }
    s.increment(identifier, t.exponent); s
  end
end