Class: Dry::Logic::RuleCompiler
- Inherits:
-
Object
- Object
- Dry::Logic::RuleCompiler
- Includes:
- Core::Constants
- Defined in:
- lib/dry/logic/rule_compiler.rb
Instance Attribute Summary collapse
-
#predicates ⇒ Object
readonly
Returns the value of attribute predicates.
Instance Method Summary collapse
- #call(ast) ⇒ Object
-
#initialize(predicates) ⇒ RuleCompiler
constructor
A new instance of RuleCompiler.
- #visit(node) ⇒ Object
- #visit_and(node) ⇒ Object
- #visit_attr(node) ⇒ Object
- #visit_check(node) ⇒ Object
- #visit_each(node) ⇒ Object
- #visit_implication(node) ⇒ Object
- #visit_key(node) ⇒ Object
- #visit_not(node) ⇒ Object
- #visit_or(node) ⇒ Object
- #visit_predicate(node) ⇒ Object
- #visit_set(node) ⇒ Object
- #visit_xor(node) ⇒ Object
Constructor Details
#initialize(predicates) ⇒ RuleCompiler
Returns a new instance of RuleCompiler.
15 16 17 |
# File 'lib/dry/logic/rule_compiler.rb', line 15 def initialize(predicates) @predicates = predicates end |
Instance Attribute Details
#predicates ⇒ Object (readonly)
Returns the value of attribute predicates.
13 14 15 |
# File 'lib/dry/logic/rule_compiler.rb', line 13 def predicates @predicates end |
Instance Method Details
#call(ast) ⇒ Object
19 20 21 |
# File 'lib/dry/logic/rule_compiler.rb', line 19 def call(ast) ast.map { |node| visit(node) } end |
#visit(node) ⇒ Object
23 24 25 26 |
# File 'lib/dry/logic/rule_compiler.rb', line 23 def visit(node) name, nodes = node send(:"visit_#{name}", nodes) end |
#visit_and(node) ⇒ Object
67 68 69 70 |
# 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) ⇒ Object
42 43 44 45 |
# 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) ⇒ Object
28 29 30 31 |
# 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) ⇒ Object
51 52 53 |
# File 'lib/dry/logic/rule_compiler.rb', line 51 def visit_each(node) Operations::Each.new(visit(node)) end |
#visit_implication(node) ⇒ Object
82 83 84 85 |
# 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) ⇒ Object
37 38 39 40 |
# 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) ⇒ Object
33 34 35 |
# File 'lib/dry/logic/rule_compiler.rb', line 33 def visit_not(node) Operations::Negation.new(visit(node)) end |
#visit_or(node) ⇒ Object
72 73 74 75 |
# 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) ⇒ Object
55 56 57 58 59 60 61 62 63 64 65 |
# 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) ⇒ Object
47 48 49 |
# File 'lib/dry/logic/rule_compiler.rb', line 47 def visit_set(node) Operations::Set.new(*call(node)) end |
#visit_xor(node) ⇒ Object
77 78 79 80 |
# File 'lib/dry/logic/rule_compiler.rb', line 77 def visit_xor(node) left, right = node visit(left).xor(visit(right)) end |