class Dry::Logic::RuleCompiler
Attributes
predicates[R]
Public Class Methods
new(predicates)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 15 def initialize(predicates) @predicates = predicates end
Public Instance Methods
call(ast)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 19 def call(ast) ast.map { |node| visit(node) } end
visit(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 23 def visit(node) name, nodes = node send(:"visit_#{name}", nodes) end
visit_and(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 67 def visit_and(node) left, right = node visit(left).and(visit(right)) end
visit_attr(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 42 def visit_attr(node) name, predicate = node Operations::Attr.new(visit(predicate), name: name) end
visit_check(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 28 def visit_check(node) keys, predicate = node Operations::Check.new(visit(predicate), keys: keys) end
visit_each(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 51 def visit_each(node) Operations::Each.new(visit(node)) end
visit_implication(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 82 def visit_implication(node) left, right = node visit(left).then(visit(right)) end
visit_key(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 37 def visit_key(node) name, predicate = node Operations::Key.new(visit(predicate), name: name) end
visit_not(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 33 def visit_not(node) Operations::Negation.new(visit(node)) end
visit_or(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 72 def visit_or(node) left, right = node visit(left).or(visit(right)) end
visit_predicate(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 55 def visit_predicate(node) name, params = node predicate = Rule::Predicate.build(predicates[name]) if params.size > 1 args = params.map(&:last).reject { |val| val == Undefined } predicate.curry(*args) else predicate end end
visit_set(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 47 def visit_set(node) Operations::Set.new(*call(node)) end
visit_xor(node)
click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 77 def visit_xor(node) left, right = node visit(left).xor(visit(right)) end