Class: Trifle::Stats::Transponder::ExpressionEngine::Evaluator

Inherits:
Object
  • Object
show all
Defined in:
lib/trifle/stats/transponder/expression_engine.rb

Constant Summary collapse

ZERO =
BigDecimal('0')
AVERAGE =
lambda do |args|
  args.reduce(ZERO, :+) / BigDecimal(args.length.to_s)
end
BINARY_OPERATIONS =
{
  :+ => ->(left, right) { left + right },
  :- => ->(left, right) { left - right },
  :* => ->(left, right) { left * right },
  :/ => ->(left, right) { right.zero? ? nil : left / right }
}.freeze
FUNCTIONS =
{
  'sum' => ->(args) { args.reduce(ZERO, :+) },
  'mean' => AVERAGE,
  'avg' => AVERAGE,
  'min' => :min.to_proc,
  'max' => :max.to_proc
}.freeze

Instance Method Summary collapse

Constructor Details

#initialize(env) ⇒ Evaluator

Returns a new instance of Evaluator.



279
280
281
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 279

def initialize(env)
  @env = env || {}
end

Instance Method Details

#evaluate(node) ⇒ Object

Raises:

  • (ArgumentError)


283
284
285
286
287
288
289
290
291
292
# File 'lib/trifle/stats/transponder/expression_engine.rb', line 283

def evaluate(node)
  type, *rest = node
  return rest[0] if type == :number
  return evaluate_variable(rest[0]) if type == :var
  return evaluate_negation(rest[0]) if type == :neg
  return evaluate_binary(type, rest[0], rest[1]) if BINARY_OPERATIONS.key?(type)
  return evaluate_function(rest[0], rest[1]) if type == :func

  raise ArgumentError, "Unknown AST node #{type.inspect}."
end