Class: Trifle::Stats::Transponder::ExpressionEngine::Evaluator
- Inherits:
-
Object
- Object
- Trifle::Stats::Transponder::ExpressionEngine::Evaluator
- 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
- #evaluate(node) ⇒ Object
-
#initialize(env) ⇒ Evaluator
constructor
A new instance of Evaluator.
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
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 |