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.
Files changed (4) hide show
  1. checksums.yaml +4 -4
  2. data/lib/expression.rb +71 -223
  3. data/lib/version.rb +1 -1
  4. metadata +1 -1
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 6ee105d363cf474e3cea5ed06d5f388998fcd25f82cbf9dadf660871965dab47
4
- data.tar.gz: d09b013d9eea9552b5407f4f34bdcb8efb7c35153ccd3f7b92c262595d82dce1
3
+ metadata.gz: e55a96130ccaa3a7339eb41b9f847ba7ed6bbf661e296b2c299e91fb972ebfbb
4
+ data.tar.gz: 9703237cc621039067556d95bbadef67dd39be197acff6f2a70dad3fdb3b0d55
5
5
  SHA512:
6
- metadata.gz: 218dab1a235b9e4884fbf12c6d714748f8d1702a195b29cf669b48774b507484cb6f45bcde2811b4bf88a25bafcb40e98dff6bd04857e0bc8acca98ab7d6cfaf
7
- data.tar.gz: a171f17a41bee800df1f828818aa4e8443c759156f179910720f26a748a0282a9fb09c93b8f3ac7055062b915f4239fc95bb29911e00a25d8f1ea567bb7c2e5d
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 |(expression)
10
- if expression.is_a?(::Expressions::Expression)
11
- union_expression(expression)
12
- else
13
- value?(expression) ? union_value(expression) : union_type(expression)
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
- def >(expression)
40
- if expression.is_a?(::Expressions::Expression)
41
- gt_expression(expression)
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 union_expression(expression)
136
- nil
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
- def intersect_value(value)
152
- nil
62
+ value?(expression) ? send(:"#{prefix}_value", expression) : send(:"#{prefix}_type", expression)
153
63
  end
154
64
 
155
- def intersect_type(type)
156
- nil
157
- end
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 add_expression(expression)
160
- nil
161
- end
70
+ def intersect_expression(expression) = nil
71
+ def intersect_value(value) = nil
72
+ def intersect_type(type) = nil
162
73
 
163
- def add_value(value)
164
- nil
165
- end
74
+ def add_expression(expression) = nil
75
+ def add_value(value) = nil
76
+ def add_type(type) = nil
166
77
 
167
- def add_type(type)
168
- nil
169
- end
78
+ def gt_expression(expression) = nil
79
+ def gt_value(value) = nil
80
+ def gt_type(type) = nil
170
81
 
171
- def gt_expression(expression)
172
- nil
173
- end
82
+ def lt_expression(expression) = nil
83
+ def lt_value(value) = nil
84
+ def lt_type(type) = nil
174
85
 
175
- def gt_value(value)
176
- nil
177
- end
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 gt_type(type)
180
- nil
181
- end
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 lt_expression(expression)
184
- nil
185
- end
94
+ def compare_expression(expression) = nil
95
+ def compare_value(value) = nil
96
+ def compare_type(type) = nil
186
97
 
187
- def lt_value(value)
188
- nil
189
- end
98
+ def xor_expression(expression) = nil
99
+ def xor_value(value) = nil
100
+ def xor_type(type) = nil
190
101
 
191
- def lt_type(type)
192
- nil
193
- end
102
+ def multiply_expression(expression) = nil
103
+ def multiply_value(value) = nil
104
+ def multiply_type(type) = nil
194
105
 
195
- def gt_or_eq_expression(expression)
196
- nil
197
- end
106
+ def divide_expression(expression) = nil
107
+ def divide_value(value) = nil
108
+ def divide_type(type) = nil
198
109
 
199
- def gt_or_eq_value(value)
200
- nil
201
- end
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
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Expressions
4
- VERSION = '0.3.0'
4
+ VERSION = '0.4.0'
5
5
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: expressions
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - maedi