expressions 0.3.0 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/expression.rb +71 -223
- data/lib/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: e55a96130ccaa3a7339eb41b9f847ba7ed6bbf661e296b2c299e91fb972ebfbb
|
|
4
|
+
data.tar.gz: 9703237cc621039067556d95bbadef67dd39be197acff6f2a70dad3fdb3b0d55
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 602cf515cd17fee068a85fcc326b7a6a683e5b5d713df92b770293ee0bdf7c77199a6535b07ed42cfc1e5a05502e80cb386ecbe0a2344436f05c65ec75286b36
|
|
7
|
+
data.tar.gz: 1e91f795dbefeb8b5bb59d0d6455dc37362fdfba241339daa840ef9a73f476b7859deba291819020b40d09946c6bef7fed1ed0e1810d90f21ed74f2aeb1cb9de
|
data/lib/expression.rb
CHANGED
|
@@ -6,114 +6,38 @@ module Expressions
|
|
|
6
6
|
@expressions = []
|
|
7
7
|
end
|
|
8
8
|
|
|
9
|
-
def
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
def initialize_copy(source)
|
|
10
|
+
super
|
|
11
|
+
@expressions = @expressions.dup
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
OPERATORS = {
|
|
15
|
+
:| => :union,
|
|
16
|
+
:& => :intersect,
|
|
17
|
+
:+ => :add,
|
|
18
|
+
:> => :gt,
|
|
19
|
+
:< => :lt,
|
|
20
|
+
:>= => :gt_or_eq,
|
|
21
|
+
:<= => :lt_or_eq,
|
|
22
|
+
:<=> => :compare,
|
|
23
|
+
:^ => :xor,
|
|
24
|
+
:* => :multiply,
|
|
25
|
+
:/ => :divide
|
|
26
|
+
}.freeze
|
|
27
|
+
|
|
28
|
+
# Each operator calls its hook on a copy and returns the copy, so expressions can be in a variable and not mutate.
|
|
29
|
+
# string = MyExpression.new
|
|
30
|
+
# optional = string | nil # string is unchanged
|
|
31
|
+
# A subclass with mutable state copies it in `initialize_copy`.
|
|
32
|
+
OPERATORS.each do |operator, prefix|
|
|
33
|
+
define_method(operator) do |expression|
|
|
34
|
+
dup.tap { |copy| copy.send(:call_hook, prefix, expression) }
|
|
14
35
|
end
|
|
15
|
-
|
|
16
|
-
self
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def &(expression)
|
|
20
|
-
if expression.is_a?(::Expressions::Expression)
|
|
21
|
-
intersect_expression(expression)
|
|
22
|
-
else
|
|
23
|
-
value?(expression) ? intersect_value(expression) : intersect_type(expression)
|
|
24
|
-
end
|
|
25
|
-
|
|
26
|
-
self
|
|
27
|
-
end
|
|
28
|
-
|
|
29
|
-
def +(expression)
|
|
30
|
-
if expression.is_a?(::Expressions::Expression)
|
|
31
|
-
add_expression(expression)
|
|
32
|
-
else
|
|
33
|
-
value?(expression) ? add_value(expression) : add_type(expression)
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
self
|
|
37
36
|
end
|
|
38
37
|
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
else
|
|
43
|
-
value?(expression) ? gt_value(expression) : gt_type(expression)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
self
|
|
47
|
-
end
|
|
48
|
-
|
|
49
|
-
def <(expression)
|
|
50
|
-
if expression.is_a?(::Expressions::Expression)
|
|
51
|
-
lt_expression(expression)
|
|
52
|
-
else
|
|
53
|
-
value?(expression) ? lt_value(expression) : lt_type(expression)
|
|
54
|
-
end
|
|
55
|
-
|
|
56
|
-
self
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def >=(expression)
|
|
60
|
-
if expression.is_a?(::Expressions::Expression)
|
|
61
|
-
gt_or_eq_expression(expression)
|
|
62
|
-
else
|
|
63
|
-
value?(expression) ? gt_or_eq_value(expression) : gt_or_eq_type(expression)
|
|
64
|
-
end
|
|
65
|
-
|
|
66
|
-
self
|
|
67
|
-
end
|
|
68
|
-
|
|
69
|
-
def <=(expression)
|
|
70
|
-
if expression.is_a?(::Expressions::Expression)
|
|
71
|
-
lt_or_eq_expression(expression)
|
|
72
|
-
else
|
|
73
|
-
value?(expression) ? lt_or_eq_value(expression) : lt_or_eq_type(expression)
|
|
74
|
-
end
|
|
75
|
-
|
|
76
|
-
self
|
|
77
|
-
end
|
|
78
|
-
|
|
79
|
-
def <=>(expression)
|
|
80
|
-
if expression.is_a?(::Expressions::Expression)
|
|
81
|
-
compare_expression(expression)
|
|
82
|
-
else
|
|
83
|
-
value?(expression) ? compare_value(expression) : compare_type(expression)
|
|
84
|
-
end
|
|
85
|
-
|
|
86
|
-
self
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
def ^(expression)
|
|
90
|
-
if expression.is_a?(::Expressions::Expression)
|
|
91
|
-
xor_expression(expression)
|
|
92
|
-
else
|
|
93
|
-
value?(expression) ? xor_value(expression) : xor_type(expression)
|
|
94
|
-
end
|
|
95
|
-
|
|
96
|
-
self
|
|
97
|
-
end
|
|
98
|
-
|
|
99
|
-
def *(expression)
|
|
100
|
-
if expression.is_a?(::Expressions::Expression)
|
|
101
|
-
multiply_expression(expression)
|
|
102
|
-
else
|
|
103
|
-
value?(expression) ? multiply_value(expression) : multiply_type(expression)
|
|
104
|
-
end
|
|
105
|
-
|
|
106
|
-
self
|
|
107
|
-
end
|
|
108
|
-
|
|
109
|
-
def /(expression)
|
|
110
|
-
if expression.is_a?(::Expressions::Expression)
|
|
111
|
-
divide_expression(expression)
|
|
112
|
-
else
|
|
113
|
-
value?(expression) ? divide_value(expression) : divide_type(expression)
|
|
114
|
-
end
|
|
115
|
-
|
|
116
|
-
self
|
|
38
|
+
# `<<` is an action like Ruby's Array#<<. It calls its hook on the expression itself and returns what was inserted.
|
|
39
|
+
def <<(expression)
|
|
40
|
+
call_hook(:append, expression)
|
|
117
41
|
end
|
|
118
42
|
|
|
119
43
|
def types
|
|
@@ -121,7 +45,7 @@ module Expressions
|
|
|
121
45
|
end
|
|
122
46
|
|
|
123
47
|
class << self
|
|
124
|
-
def |(expression)
|
|
48
|
+
def |(expression) # rubocop:disable Naming/BinaryOperatorParameterName
|
|
125
49
|
self.new | expression
|
|
126
50
|
end
|
|
127
51
|
end
|
|
@@ -132,136 +56,60 @@ module Expressions
|
|
|
132
56
|
!expression.instance_of?(Class)
|
|
133
57
|
end
|
|
134
58
|
|
|
135
|
-
def
|
|
136
|
-
|
|
137
|
-
end
|
|
138
|
-
|
|
139
|
-
def union_value(value)
|
|
140
|
-
nil
|
|
141
|
-
end
|
|
142
|
-
|
|
143
|
-
def union_type(type)
|
|
144
|
-
nil
|
|
145
|
-
end
|
|
146
|
-
|
|
147
|
-
def intersect_expression(expression)
|
|
148
|
-
nil
|
|
149
|
-
end
|
|
59
|
+
def call_hook(prefix, expression)
|
|
60
|
+
return send(:"#{prefix}_expression", expression) if expression.is_a?(::Expressions::Expression)
|
|
150
61
|
|
|
151
|
-
|
|
152
|
-
nil
|
|
62
|
+
value?(expression) ? send(:"#{prefix}_value", expression) : send(:"#{prefix}_type", expression)
|
|
153
63
|
end
|
|
154
64
|
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
65
|
+
# rubocop:disable Lint/UnusedMethodArgument
|
|
66
|
+
def union_expression(expression) = nil
|
|
67
|
+
def union_value(value) = nil
|
|
68
|
+
def union_type(type) = nil
|
|
158
69
|
|
|
159
|
-
def
|
|
160
|
-
|
|
161
|
-
|
|
70
|
+
def intersect_expression(expression) = nil
|
|
71
|
+
def intersect_value(value) = nil
|
|
72
|
+
def intersect_type(type) = nil
|
|
162
73
|
|
|
163
|
-
def
|
|
164
|
-
|
|
165
|
-
|
|
74
|
+
def add_expression(expression) = nil
|
|
75
|
+
def add_value(value) = nil
|
|
76
|
+
def add_type(type) = nil
|
|
166
77
|
|
|
167
|
-
def
|
|
168
|
-
|
|
169
|
-
|
|
78
|
+
def gt_expression(expression) = nil
|
|
79
|
+
def gt_value(value) = nil
|
|
80
|
+
def gt_type(type) = nil
|
|
170
81
|
|
|
171
|
-
def
|
|
172
|
-
|
|
173
|
-
|
|
82
|
+
def lt_expression(expression) = nil
|
|
83
|
+
def lt_value(value) = nil
|
|
84
|
+
def lt_type(type) = nil
|
|
174
85
|
|
|
175
|
-
def
|
|
176
|
-
|
|
177
|
-
|
|
86
|
+
def gt_or_eq_expression(expression) = nil
|
|
87
|
+
def gt_or_eq_value(value) = nil
|
|
88
|
+
def gt_or_eq_type(type) = nil
|
|
178
89
|
|
|
179
|
-
def
|
|
180
|
-
|
|
181
|
-
|
|
90
|
+
def lt_or_eq_expression(expression) = nil
|
|
91
|
+
def lt_or_eq_value(value) = nil
|
|
92
|
+
def lt_or_eq_type(type) = nil
|
|
182
93
|
|
|
183
|
-
def
|
|
184
|
-
|
|
185
|
-
|
|
94
|
+
def compare_expression(expression) = nil
|
|
95
|
+
def compare_value(value) = nil
|
|
96
|
+
def compare_type(type) = nil
|
|
186
97
|
|
|
187
|
-
def
|
|
188
|
-
|
|
189
|
-
|
|
98
|
+
def xor_expression(expression) = nil
|
|
99
|
+
def xor_value(value) = nil
|
|
100
|
+
def xor_type(type) = nil
|
|
190
101
|
|
|
191
|
-
def
|
|
192
|
-
|
|
193
|
-
|
|
102
|
+
def multiply_expression(expression) = nil
|
|
103
|
+
def multiply_value(value) = nil
|
|
104
|
+
def multiply_type(type) = nil
|
|
194
105
|
|
|
195
|
-
def
|
|
196
|
-
|
|
197
|
-
|
|
106
|
+
def divide_expression(expression) = nil
|
|
107
|
+
def divide_value(value) = nil
|
|
108
|
+
def divide_type(type) = nil
|
|
198
109
|
|
|
199
|
-
def
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
def gt_or_eq_type(type)
|
|
204
|
-
nil
|
|
205
|
-
end
|
|
206
|
-
|
|
207
|
-
def lt_or_eq_expression(expression)
|
|
208
|
-
nil
|
|
209
|
-
end
|
|
210
|
-
|
|
211
|
-
def lt_or_eq_value(value)
|
|
212
|
-
nil
|
|
213
|
-
end
|
|
214
|
-
|
|
215
|
-
def lt_or_eq_type(type)
|
|
216
|
-
nil
|
|
217
|
-
end
|
|
218
|
-
|
|
219
|
-
def compare_expression(expression)
|
|
220
|
-
nil
|
|
221
|
-
end
|
|
222
|
-
|
|
223
|
-
def compare_value(value)
|
|
224
|
-
nil
|
|
225
|
-
end
|
|
226
|
-
|
|
227
|
-
def compare_type(type)
|
|
228
|
-
nil
|
|
229
|
-
end
|
|
230
|
-
|
|
231
|
-
def xor_expression(expression)
|
|
232
|
-
nil
|
|
233
|
-
end
|
|
234
|
-
|
|
235
|
-
def xor_value(value)
|
|
236
|
-
nil
|
|
237
|
-
end
|
|
238
|
-
|
|
239
|
-
def xor_type(type)
|
|
240
|
-
nil
|
|
241
|
-
end
|
|
242
|
-
|
|
243
|
-
def multiply_expression(expression)
|
|
244
|
-
nil
|
|
245
|
-
end
|
|
246
|
-
|
|
247
|
-
def multiply_value(value)
|
|
248
|
-
nil
|
|
249
|
-
end
|
|
250
|
-
|
|
251
|
-
def multiply_type(type)
|
|
252
|
-
nil
|
|
253
|
-
end
|
|
254
|
-
|
|
255
|
-
def divide_expression(expression)
|
|
256
|
-
nil
|
|
257
|
-
end
|
|
258
|
-
|
|
259
|
-
def divide_value(value)
|
|
260
|
-
nil
|
|
261
|
-
end
|
|
262
|
-
|
|
263
|
-
def divide_type(type)
|
|
264
|
-
nil
|
|
265
|
-
end
|
|
110
|
+
def append_expression(expression) = nil
|
|
111
|
+
def append_value(value) = nil
|
|
112
|
+
def append_type(type) = nil
|
|
113
|
+
# rubocop:enable Lint/UnusedMethodArgument
|
|
266
114
|
end
|
|
267
115
|
end
|
data/lib/version.rb
CHANGED