class Dry::Logic::Rule::Interface

Constants

SPLAT

Attributes

arity[R]
curried[R]

Public Class Methods

new(arity, curried) click to toggle source
# File lib/dry/logic/rule/interface.rb, line 13
def initialize(arity, curried)
  @arity = arity
  @curried = curried

  if !variable_arity? && curried > arity
    raise ArgumentError, "wrong number of arguments (#{curried} for #{arity})"
  end

  define_constructor if curried?

  if constant?
    define_constant_application
  else
    define_application
  end
end

Public Instance Methods

[](*) click to toggle source
# File lib/dry/logic/rule/interface.rb, line 105
def [](*)
  @predicate[]
end
call(*) click to toggle source
# File lib/dry/logic/rule/interface.rb, line 97
def call(*)
  if @predicate[]
    Result::SUCCESS
  else
    Result.new(false, id) { ast }
  end
end
constant?() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 30
def constant?
  arity.zero?
end
curried?() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 38
def curried?
  !curried.zero?
end
curried_args() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 131
def curried_args
  @curried_args ||= ::Array.new(curried) { |i| "@arg#{i}" }
end
define_application() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 111
        def define_application
          splat = variable_arity? ? SPLAT : EMPTY_ARRAY
          parameters = (unapplied_args + splat).join(", ")
          application = "@predicate[#{(curried_args + unapplied_args + splat).join(", ")}]"

          module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
            def call(#{parameters})
              if #{application}
                Result::SUCCESS
              else
                Result.new(false, id) { ast(#{parameters}) }
              end
            end

            def [](#{parameters})
              #{application}
            end
          RUBY
        end
define_constant_application() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 95
def define_constant_application
  module_exec do
    def call(*)
      if @predicate[]
        Result::SUCCESS
      else
        Result.new(false, id) { ast }
      end
    end

    def [](*)
      @predicate[]
    end
  end
end
define_constructor() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 78
        def define_constructor
          assignment =
            if curried.equal?(1)
              "@arg0 = @args[0]"
            else
              "#{curried_args.join(", ")} = @args"
            end

          module_eval(<<~RUBY, __FILE__, __LINE__ + 1)
            def initialize(*)
              super

              #{assignment}
            end
          RUBY
        end
name() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 56
def name
  if constant?
    "Constant"
  else
    arity_str =
      if variable_arity?
        "Variable#{arity.abs - 1}Arity"
      else
        "#{arity}Arity"
      end

    curried_str =
      if curried?
        "#{curried}Curried"
      else
        EMPTY_STRING
      end

    "#{arity_str}#{curried_str}"
  end
end
unapplied() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 42
def unapplied
  if variable_arity?
    unapplied = arity.abs - 1 - curried

    if unapplied.negative?
      0
    else
      unapplied
    end
  else
    arity - curried
  end
end
unapplied_args() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 135
def unapplied_args
  @unapplied_args ||= ::Array.new(unapplied) { |i| "input#{i}" }
end
variable_arity?() click to toggle source
# File lib/dry/logic/rule/interface.rb, line 34
def variable_arity?
  arity.negative?
end