class Keisan::Functions::Replace

Public Class Methods

new() click to toggle source
# File lib/keisan/functions/replace.rb, line 4
def initialize
  @name = "replace"
end

Public Instance Methods

evaluate(ast_function, context = nil) click to toggle source
# File lib/keisan/functions/replace.rb, line 23
def evaluate(ast_function, context = nil)
  context ||= Context.new
  simplify(ast_function, context).evaluate(context)
end
simplify(ast_function, context = nil) click to toggle source
# File lib/keisan/functions/replace.rb, line 13
def simplify(ast_function, context = nil)
  context ||= Context.new
  expression, variable, replacement = expression_variable_replacement(ast_function)

  expression = expression.simplify(context)
  replacement = replacement.simplify(context)

  expression.replace(variable, replacement).simplify(context)
end
value(ast_function, context = nil) click to toggle source
# File lib/keisan/functions/replace.rb, line 8
def value(ast_function, context = nil)
  context ||= Context.new
  evaluate(ast_function, context).value(context)
end

Private Instance Methods

expression_variable_replacement(ast_function) click to toggle source
# File lib/keisan/functions/replace.rb, line 30
def expression_variable_replacement(ast_function)
  unless ast_function.is_a?(AST::Function) && ast_function.name == name
    raise Exceptions::InvalidFunctionError.new("Must receive replace function")
  end

  unless ast_function.children.size == 3
    raise Exceptions::InvalidFunctionError.new("Require 3 arguments to replace")
  end

  expression, variable, replacement = *ast_function.children.map(&:deep_dup)

  unless variable.is_a?(AST::Variable)
    raise Exceptions::InvalidFunctionError.new("Replace must replace a variable")
  end

  [expression, variable, replacement]
end