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.



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

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.



5
6
7
# File 'lib/dry/logic/rule/interface.rb', line 5

def arity
  @arity
end

#curriedObject (readonly)

Returns the value of attribute curried.



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

def curried
  @curried
end

Instance Method Details

#constant?Boolean

Returns:

  • (Boolean)


28
29
30
# File 'lib/dry/logic/rule/interface.rb', line 28

def constant?
  arity.zero?
end

#curried?Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/dry/logic/rule/interface.rb', line 36

def curried?
  !curried.zero?
end

#curried_argsObject



134
135
136
# File 'lib/dry/logic/rule/interface.rb', line 134

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

#define_constant_applicationObject



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

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



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

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



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

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



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

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



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

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



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

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

#unapplied_argsObject



138
139
140
# File 'lib/dry/logic/rule/interface.rb', line 138

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

#variable_arity?Boolean

Returns:

  • (Boolean)


32
33
34
# File 'lib/dry/logic/rule/interface.rb', line 32

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