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