Sha256: 8036ba5e0acd804cff3ea6851918a24f7577f63b5e99ef2e313145fc39520502

Contents?: true

Size: 1008 Bytes

Versions: 6

Compression:

Stored size: 1008 Bytes

Contents

module Unitwise
  module Expression
    class Decomposer

      METHODS = [:primary_code, :secondary_code, :names, :slugs, :symbol]

      PARSERS = METHODS.reduce({}) do |hash, method|
        hash[method] = Parser.new(method); hash
      end

      TRANSFORMER = Transformer.new

      attr_reader :expression

      def initialize(expression)
        @expression = expression.to_s
        if terms.nil? || terms.empty?
          raise ExpressionError, "Could not evaluate '#{@expression}'."
        end
      end

      def transform
        PARSERS.reduce(nil) do |foo, (method, parser)|
          if parsed = parser.parse(expression) rescue next
            return TRANSFORMER.apply(parsed, key: method)
          end
        end
      end

      def terms
        @terms ||= begin
          transformation = transform
          if transformation.respond_to?(:terms)
            transformation.terms
          else
            Array(transformation)
          end
        end
      end

    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
unitwise-0.6.0 lib/unitwise/expression/decomposer.rb
unitwise-0.5.1 lib/unitwise/expression/decomposer.rb
unitwise-0.5.0 lib/unitwise/expression/decomposer.rb
unitwise-0.4.0 lib/unitwise/expression/decomposer.rb
unitwise-0.3.2 lib/unitwise/expression/decomposer.rb
unitwise-0.3.1 lib/unitwise/expression/decomposer.rb