class Dry::Logic::Rule
Attributes
args[R]
arity[R]
options[R]
predicate[R]
Public Class Methods
build(predicate, args: EMPTY_ARRAY, arity: predicate.arity, **options)
click to toggle source
# File lib/dry/logic/rule.rb, line 46 def self.build(predicate, args: EMPTY_ARRAY, arity: predicate.arity, **options) specialize(arity, args.size).new(predicate, {args: args, arity: arity, **options}) end
interfaces()
click to toggle source
# File lib/dry/logic/rule.rb, line 33 def self.interfaces @interfaces ||= ::Concurrent::Map.new end
new(predicate, options = EMPTY_HASH)
click to toggle source
# File lib/dry/logic/rule.rb, line 50 def initialize(predicate, options = EMPTY_HASH) @predicate = predicate @options = options @args = options[:args] || EMPTY_ARRAY @arity = options[:arity] || predicate.arity end
specialize(arity, curried, base = Rule)
click to toggle source
# File lib/dry/logic/rule.rb, line 37 def self.specialize(arity, curried, base = Rule) base.interfaces.fetch_or_store([arity, curried]) do interface = Interface.new(arity, curried) klass = Class.new(base) { include interface } base.const_set("#{base.name.split("::").last}#{interface.name}", klass) klass end end
Public Instance Methods
ast(input = Undefined)
click to toggle source
# File lib/dry/logic/rule.rb, line 92 def ast(input = Undefined) [:predicate, [id, args_with_names(input)]] end
bind(object)
click to toggle source
# File lib/dry/logic/rule.rb, line 69 def bind(object) if predicate.respond_to?(:bind) self.class.build(predicate.bind(object), **options) else self.class.build( -> *args { object.instance_exec(*args, &predicate) }, **options, arity: arity, parameters: parameters ) end end
curry(*new_args)
click to toggle source
# File lib/dry/logic/rule.rb, line 65 def curry(*new_args) with(args: args + new_args) end
eval_args(object)
click to toggle source
# File lib/dry/logic/rule.rb, line 80 def eval_args(object) with(args: args.map { |arg| UnboundMethod === arg ? arg.bind(object).() : arg }) end
id()
click to toggle source
# File lib/dry/logic/rule.rb, line 61 def id options[:id] end
parameters()
click to toggle source
# File lib/dry/logic/rule.rb, line 88 def parameters options[:parameters] || predicate.parameters end
type()
click to toggle source
# File lib/dry/logic/rule.rb, line 57 def type :rule end
with(new_opts)
click to toggle source
# File lib/dry/logic/rule.rb, line 84 def with(new_opts) self.class.build(predicate, **options, **new_opts) end
Private Instance Methods
args_with_names(*input)
click to toggle source
# File lib/dry/logic/rule.rb, line 98 def args_with_names(*input) parameters.map(&:last).zip(args + input) end