Class: Dry::Logic::Rule::Interface

Inherits:
Module
  • Object
show all
Defined in:
lib/dry/logic/rule/interface.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(arity, curried) ⇒ Interface

Returns a new instance of Interface.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
# File 'lib/dry/logic/rule/interface.rb', line 11

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 variable_arity?
    define_splat_application
  elsif constant?
    define_constant_application
  else
    define_fixed_application
  end
end

Instance Attribute Details

#arityObject (readonly)

Returns the value of attribute arity.



7
8
9
# File 'lib/dry/logic/rule/interface.rb', line 7

def arity
  @arity
end

#curriedObject (readonly)

Returns the value of attribute curried.



9
10
11
# File 'lib/dry/logic/rule/interface.rb', line 9

def curried
  @curried
end

Instance Method Details

#constant?Boolean

Returns:

  • (Boolean)


30
31
32
# File 'lib/dry/logic/rule/interface.rb', line 30

def constant?
  arity.zero?
end

#curried?Boolean

Returns:

  • (Boolean)


38
39
40
# File 'lib/dry/logic/rule/interface.rb', line 38

def curried?
  !curried.zero?
end

#curried_argsObject



136
137
138
# File 'lib/dry/logic/rule/interface.rb', line 136

def curried_args
  @curried_args ||= ::Array.new(curried) { |i| "@arg#{i}" }
end

#define_constant_applicationObject



78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# File 'lib/dry/logic/rule/interface.rb', line 78

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_constructorObject



61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
# File 'lib/dry/logic/rule/interface.rb', line 61

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

#define_fixed_applicationObject



117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/dry/logic/rule/interface.rb', line 117

def define_fixed_application
  parameters = unapplied_args.join(', ')
  application = "@predicate[#{ (curried_args + unapplied_args).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_splat_applicationObject



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/dry/logic/rule/interface.rb', line 94

def define_splat_application
  application =
    if curried?
      "@predicate[#{curried_args.join(', ')}, *input]"
    else
      '@predicate[*input]'
    end

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

    def [](*input)
      #{application}
    end
  RUBY
end

#nameObject



50
51
52
53
54
55
56
57
58
59
# File 'lib/dry/logic/rule/interface.rb', line 50

def name
  if constant?
    'Constant'
  else
    arity_str = variable_arity? ? 'VariableArity' : "#{arity}Arity"
    curried_str = curried? ? "#{curried}Curried" : EMPTY_STRING

    "#{arity_str}#{curried_str}"
  end
end

#unappliedObject



42
43
44
45
46
47
48
# File 'lib/dry/logic/rule/interface.rb', line 42

def unapplied
  if variable_arity?
    -1
  else
    arity - curried
  end
end

#unapplied_argsObject



140
141
142
# File 'lib/dry/logic/rule/interface.rb', line 140

def unapplied_args
  @unapplied_args ||= ::Array.new(unapplied) { |i| "input#{i}" }
end

#variable_arity?Boolean

Returns:

  • (Boolean)


34
35
36
# File 'lib/dry/logic/rule/interface.rb', line 34

def variable_arity?
  arity.equal?(-1)
end