class Dry::Logic::RuleCompiler

Attributes

predicates[R]

Public Class Methods

new(predicates) click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 8
def initialize(predicates)
  @predicates = predicates
end

Public Instance Methods

call(ast) click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 12
def call(ast)
  ast.map { |node| visit(node) }
end
visit(node) click to toggle source
# File lib/dry/logic/rule_compiler.rb, line 16
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 60
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 35
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 21
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 44
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 75
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 30
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 26
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 65
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 48
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 40
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 70
def visit_xor(node)
  left, right = node
  visit(left).xor(visit(right))
end