class RPNCalculator::OperationProcessor

Attributes

operation_classes[R]
operation_symbols[R]

Public Class Methods

new(operation_classes) click to toggle source
# File lib/rpn-calculator/operation_processor.rb, line 3
def initialize(operation_classes)
  @operation_classes = operation_classes
  @operation_symbols = @operation_classes.keys
end

Public Instance Methods

process(parsed_expression) click to toggle source
# File lib/rpn-calculator/operation_processor.rb, line 8
def process(parsed_expression)
  result_stack = parsed_expression.inject([]) do |stack, element|
    if operation_symbols.include?(element)
      result = operation_classes.fetch(element).operate(stack.pop(2))
      return invalid_processor_result(result) unless result.valid?
      stack.push(result.result)
    else
      stack.push(as_float(element))
    end
    stack
  end
  Result::Processor.new(result_stack)
end

Private Instance Methods

as_float(num_string) click to toggle source
# File lib/rpn-calculator/operation_processor.rb, line 30
def as_float(num_string)
  Float(num_string)
end
invalid_processor_result(result) click to toggle source
# File lib/rpn-calculator/operation_processor.rb, line 26
def invalid_processor_result(result)
  Result::Processor.new([], result.error)
end