Sha256: a7b0e4fa6ff59b3916a84af1ef7ef9dd02780f25f21009d62cb3dc7354cabd38

Contents?: true

Size: 1.12 KB

Versions: 5

Compression:

Stored size: 1.12 KB

Contents

module Unitwise
  module Expression
    class Composer
      attr_reader :terms
      def initialize(input)
        if input.respond_to?(:terms)
          @terms = input.terms
        elsif input.respond_to?(:each)
          @terms = input
        else
          @terms = Expression.decompose(input.to_s)
        end
      end

      def set
        @set ||= terms.reduce(SignedMultiset.new) do |s, t|
          s.increment({f: t.factor, p: t.prefix_code, a: t.atom_code}, t.exponent); s
        end
      end

      def numerator
        @numerator ||= set.select{|k,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

      def denominator
        @denominator ||= set.select{|k,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

      def expression
        @expression = []
        @expression << (numerator.empty? ? '1' : numerator)
        (@expression << denominator) unless denominator.empty?
        @expression.join('/')
      end
    end
  end
end

Version data entries

5 entries across 5 versions & 1 rubygems

Version Path
unitwise-0.3.0 lib/unitwise/expression/composer.rb
unitwise-0.2.2 lib/unitwise/expression/composer.rb
unitwise-0.2.1 lib/unitwise/expression/composer.rb
unitwise-0.2.0 lib/unitwise/expression/composer.rb
unitwise-0.1.0 lib/unitwise/expression/composer.rb