maths 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -176,6 +176,8 @@ Percentages!
176
176
  ```
177
177
  maths> 2 as a % of 4
178
178
  = 50%
179
+ maths> 5 as a % change from 10
180
+ = -50%
179
181
  ```
180
182
 
181
183
  Maths also includes some constants:
data/lib/maths/calc.rb CHANGED
@@ -10,7 +10,7 @@ require 'racc/parser.rb'
10
10
  module Maths
11
11
  class Calculator < Racc::Parser
12
12
 
13
- module_eval(<<'...end calc.y/module_eval...', 'calc.y', 39)
13
+ module_eval(<<'...end calc.y/module_eval...', 'calc.y', 41)
14
14
 
15
15
  def parse(str)
16
16
  @q = []
@@ -30,6 +30,9 @@ module_eval(<<'...end calc.y/module_eval...', 'calc.y', 39)
30
30
  when /\Aas % of/
31
31
  @q.push [:PERCENTAGE_OF, $&]
32
32
 
33
+ when /\Aas a % change from/
34
+ @q.push [:PERCENTAGE_TO, $&]
35
+
33
36
  # special terms
34
37
  when /\Api/
35
38
  @q.push [:NUMBER, BigDecimal.new("3.14159265358979323846264338327")]
@@ -67,60 +70,64 @@ module_eval(<<'...end calc.y/module_eval...', 'calc.y', 39)
67
70
  ##### State transition tables begin ###
68
71
 
69
72
  racc_action_table = [
70
- 9, 16, 13, 14, 15, 21, 6, 10, 9, 4,
71
- 22, 5, 8, 7, 6, 24, 9, 4, nil, 5,
72
- 8, 7, 6, nil, 9, 4, nil, 5, 8, 19,
73
- 6, nil, 9, 4, nil, 5, 8, 19, 6, nil,
74
- 9, 4, nil, 5, 8, 19, 6, nil, 9, 4,
75
- nil, 5, 8, 19, 6, nil, 9, 4, nil, 5,
76
- 8, 19, 6, nil, 9, 4, nil, 5, 8, 19,
77
- 6, nil, 9, 4, nil, 5, 8, 19, 6, nil,
78
- 9, 4, nil, 5, 8, 19, 6, nil, 9, 4,
79
- nil, 5, 8, 19, 6, nil, nil, 4, nil, 5,
80
- 8, 19, 16, 13, 14, 15, 11, 12, 17, nil,
81
- nil, nil, 33, 16, 13, 14, 15, 11, 12, 17,
82
- nil, nil, 32, 16, 13, 14, 15, 11, 12, 17,
83
- 16, 13, 14, 15, 11, 12, 17, 16, 13, 14,
84
- 15, 11, 12, 17, 16, 13, 14, 15 ]
73
+ 9, 16, 13, 14, 15, 9, 6, 10, 22, 23,
74
+ 4, 6, 5, 8, 7, 4, 9, 5, 8, 7,
75
+ 25, 9, 6, nil, nil, nil, 4, 6, 5, 8,
76
+ 20, 4, 9, 5, 8, 20, nil, 9, 6, nil,
77
+ nil, nil, 4, 6, 5, 8, 20, 4, 9, 5,
78
+ 8, 20, nil, 9, 6, nil, nil, nil, 4, 6,
79
+ 5, 8, 20, 4, 9, 5, 8, 20, nil, 9,
80
+ 6, nil, nil, nil, 4, 6, 5, 8, 20, 4,
81
+ 9, 5, 8, 20, nil, 9, 6, nil, nil, nil,
82
+ 4, 6, 5, 8, 20, 4, 9, 5, 8, 20,
83
+ nil, nil, 6, nil, nil, nil, 4, nil, 5, 8,
84
+ 20, 16, 13, 14, 15, 11, 12, 17, 18, nil,
85
+ nil, nil, 35, 16, 13, 14, 15, 11, 12, 17,
86
+ 18, nil, nil, 34, 16, 13, 14, 15, 11, 12,
87
+ 17, 18, 16, 13, 14, 15, 11, 12, 17, 18,
88
+ 16, 13, 14, 15, 11, 12, 17, 18, 16, 13,
89
+ 14, 15, 11, 12, 17, 16, 13, 14, 15 ]
85
90
 
86
91
  racc_action_check = [
87
- 0, 26, 26, 26, 26, 6, 0, 1, 22, 0,
88
- 7, 0, 0, 0, 22, 10, 17, 22, nil, 22,
89
- 22, 22, 17, nil, 4, 17, nil, 17, 17, 17,
90
- 4, nil, 5, 4, nil, 4, 4, 4, 5, nil,
91
- 16, 5, nil, 5, 5, 5, 16, nil, 15, 16,
92
- nil, 16, 16, 16, 15, nil, 9, 15, nil, 15,
93
- 15, 15, 9, nil, 14, 9, nil, 9, 9, 9,
94
- 14, nil, 11, 14, nil, 14, 14, 14, 11, nil,
95
- 12, 11, nil, 11, 11, 11, 12, nil, 13, 12,
96
- nil, 12, 12, 12, 13, nil, nil, 13, nil, 13,
97
- 13, 13, 20, 20, 20, 20, 20, 20, 20, nil,
98
- nil, nil, 20, 18, 18, 18, 18, 18, 18, 18,
99
- nil, nil, 18, 31, 31, 31, 31, 31, 31, 31,
100
- 2, 2, 2, 2, 2, 2, 2, 34, 34, 34,
101
- 34, 34, 34, 34, 25, 25, 25, 25 ]
92
+ 0, 27, 27, 27, 27, 23, 0, 1, 6, 7,
93
+ 0, 23, 0, 0, 0, 23, 18, 23, 23, 23,
94
+ 10, 4, 18, nil, nil, nil, 18, 4, 18, 18,
95
+ 18, 4, 5, 4, 4, 4, nil, 17, 5, nil,
96
+ nil, nil, 5, 17, 5, 5, 5, 17, 16, 17,
97
+ 17, 17, nil, 9, 16, nil, nil, nil, 16, 9,
98
+ 16, 16, 16, 9, 15, 9, 9, 9, nil, 11,
99
+ 15, nil, nil, nil, 15, 11, 15, 15, 15, 11,
100
+ 12, 11, 11, 11, nil, 13, 12, nil, nil, nil,
101
+ 12, 13, 12, 12, 12, 13, 14, 13, 13, 13,
102
+ nil, nil, 14, nil, nil, nil, 14, nil, 14, 14,
103
+ 14, 21, 21, 21, 21, 21, 21, 21, 21, nil,
104
+ nil, nil, 21, 19, 19, 19, 19, 19, 19, 19,
105
+ 19, nil, nil, 19, 36, 36, 36, 36, 36, 36,
106
+ 36, 36, 2, 2, 2, 2, 2, 2, 2, 2,
107
+ 33, 33, 33, 33, 33, 33, 33, 33, 32, 32,
108
+ 32, 32, 32, 32, 32, 26, 26, 26, 26 ]
102
109
 
103
110
  racc_action_pointer = [
104
- -3, 7, 126, nil, 21, 29, -10, -1, nil, 53,
105
- 15, 69, 77, 85, 61, 45, 37, 13, 109, nil,
106
- 98, nil, 5, nil, nil, 140, -3, nil, nil, nil,
107
- nil, 119, nil, nil, 133, nil ]
111
+ -3, 7, 138, nil, 18, 29, -8, -3, nil, 50,
112
+ 20, 66, 77, 82, 93, 61, 45, 34, 13, 119,
113
+ nil, 107, nil, 2, nil, nil, 161, -3, nil, nil,
114
+ nil, nil, 154, 146, nil, nil, 130, nil ]
108
115
 
109
116
  racc_action_default = [
110
- -3, -19, -1, -2, -19, -19, -19, -13, -14, -19,
111
- -19, -19, -19, -19, -19, -19, -19, -19, -19, -13,
112
- -19, -12, -19, -15, 36, -4, -5, -6, -7, -8,
113
- -9, -16, -10, -11, -17, -18 ]
117
+ -3, -20, -1, -2, -20, -20, -20, -13, -14, -20,
118
+ -20, -20, -20, -20, -20, -20, -20, -20, -20, -20,
119
+ -13, -20, -12, -20, -15, 38, -4, -5, -6, -7,
120
+ -8, -9, -16, -17, -10, -11, -18, -19 ]
114
121
 
115
122
  racc_goto_table = [
116
- 3, 2, 1, nil, nil, 18, 20, nil, nil, nil,
117
- 23, nil, 25, 26, 27, 28, 29, 30, 31, nil,
118
- nil, nil, 35, 34 ]
123
+ 3, 2, 1, nil, nil, 19, 21, nil, nil, nil,
124
+ 24, nil, 26, 27, 28, 29, 30, 31, 32, 33,
125
+ nil, nil, nil, 37, 36 ]
119
126
 
120
127
  racc_goto_check = [
121
128
  3, 2, 1, nil, nil, 2, 2, nil, nil, nil,
122
- 2, nil, 2, 2, 2, 2, 2, 2, 2, nil,
123
- nil, nil, 3, 2 ]
129
+ 2, nil, 2, 2, 2, 2, 2, 2, 2, 2,
130
+ nil, nil, nil, 3, 2 ]
124
131
 
125
132
  racc_goto_pointer = [
126
133
  nil, 2, 1, 0 ]
@@ -130,28 +137,29 @@ racc_goto_default = [
130
137
 
131
138
  racc_reduce_table = [
132
139
  0, 0, :racc_error,
133
- 1, 18, :_reduce_none,
134
- 1, 18, :_reduce_none,
135
- 0, 18, :_reduce_3,
136
- 3, 19, :_reduce_4,
137
- 3, 19, :_reduce_5,
138
- 3, 19, :_reduce_6,
139
- 3, 19, :_reduce_7,
140
- 3, 19, :_reduce_8,
141
- 3, 19, :_reduce_9,
142
- 3, 19, :_reduce_10,
143
- 3, 19, :_reduce_11,
144
- 2, 19, :_reduce_12,
145
- 1, 19, :_reduce_13,
146
140
  1, 19, :_reduce_none,
147
- 2, 19, :_reduce_15,
148
- 3, 19, :_reduce_16,
141
+ 1, 19, :_reduce_none,
142
+ 0, 19, :_reduce_3,
143
+ 3, 20, :_reduce_4,
144
+ 3, 20, :_reduce_5,
145
+ 3, 20, :_reduce_6,
146
+ 3, 20, :_reduce_7,
147
+ 3, 20, :_reduce_8,
148
+ 3, 20, :_reduce_9,
149
+ 3, 20, :_reduce_10,
150
+ 3, 20, :_reduce_11,
151
+ 2, 20, :_reduce_12,
152
+ 1, 20, :_reduce_13,
153
+ 1, 20, :_reduce_none,
154
+ 2, 20, :_reduce_15,
155
+ 3, 20, :_reduce_16,
149
156
  3, 20, :_reduce_17,
150
- 3, 20, :_reduce_18 ]
157
+ 3, 21, :_reduce_18,
158
+ 3, 21, :_reduce_19 ]
151
159
 
152
- racc_reduce_n = 19
160
+ racc_reduce_n = 20
153
161
 
154
- racc_shift_n = 36
162
+ racc_shift_n = 38
155
163
 
156
164
  racc_token_table = {
157
165
  false => 0,
@@ -165,14 +173,15 @@ racc_token_table = {
165
173
  "+" => 8,
166
174
  "-" => 9,
167
175
  :PERCENTAGE_OF => 10,
168
- "=" => 11,
169
- "(" => 12,
170
- ")" => 13,
171
- "|" => 14,
172
- :NUMBER => 15,
173
- :VARIABLE => 16 }
176
+ :PERCENTAGE_TO => 11,
177
+ "=" => 12,
178
+ "(" => 13,
179
+ ")" => 14,
180
+ "|" => 15,
181
+ :NUMBER => 16,
182
+ :VARIABLE => 17 }
174
183
 
175
- racc_nt_base = 17
184
+ racc_nt_base = 18
176
185
 
177
186
  racc_use_result_var = true
178
187
 
@@ -204,6 +213,7 @@ Racc_token_to_s_table = [
204
213
  "\"+\"",
205
214
  "\"-\"",
206
215
  "PERCENTAGE_OF",
216
+ "PERCENTAGE_TO",
207
217
  "\"=\"",
208
218
  "\"(\"",
209
219
  "\")\"",
@@ -225,77 +235,77 @@ Racc_debug_parser = false
225
235
 
226
236
  # reduce 2 omitted
227
237
 
228
- module_eval(<<'.,.,', 'calc.y', 13)
238
+ module_eval(<<'.,.,', 'calc.y', 14)
229
239
  def _reduce_3(val, _values, result)
230
240
  result = 0
231
241
  result
232
242
  end
233
243
  .,.,
234
244
 
235
- module_eval(<<'.,.,', 'calc.y', 15)
245
+ module_eval(<<'.,.,', 'calc.y', 16)
236
246
  def _reduce_4(val, _values, result)
237
247
  result += val[2]
238
248
  result
239
249
  end
240
250
  .,.,
241
251
 
242
- module_eval(<<'.,.,', 'calc.y', 16)
252
+ module_eval(<<'.,.,', 'calc.y', 17)
243
253
  def _reduce_5(val, _values, result)
244
254
  result -= val[2]
245
255
  result
246
256
  end
247
257
  .,.,
248
258
 
249
- module_eval(<<'.,.,', 'calc.y', 17)
259
+ module_eval(<<'.,.,', 'calc.y', 18)
250
260
  def _reduce_6(val, _values, result)
251
261
  result *= val[2]
252
262
  result
253
263
  end
254
264
  .,.,
255
265
 
256
- module_eval(<<'.,.,', 'calc.y', 18)
266
+ module_eval(<<'.,.,', 'calc.y', 19)
257
267
  def _reduce_7(val, _values, result)
258
268
  result /= val[2]
259
269
  result
260
270
  end
261
271
  .,.,
262
272
 
263
- module_eval(<<'.,.,', 'calc.y', 19)
273
+ module_eval(<<'.,.,', 'calc.y', 20)
264
274
  def _reduce_8(val, _values, result)
265
275
  result %= val[2]
266
276
  result
267
277
  end
268
278
  .,.,
269
279
 
270
- module_eval(<<'.,.,', 'calc.y', 20)
280
+ module_eval(<<'.,.,', 'calc.y', 21)
271
281
  def _reduce_9(val, _values, result)
272
282
  result = result.power(val[2])
273
283
  result
274
284
  end
275
285
  .,.,
276
286
 
277
- module_eval(<<'.,.,', 'calc.y', 21)
287
+ module_eval(<<'.,.,', 'calc.y', 22)
278
288
  def _reduce_10(val, _values, result)
279
289
  result = val[1]
280
290
  result
281
291
  end
282
292
  .,.,
283
293
 
284
- module_eval(<<'.,.,', 'calc.y', 22)
294
+ module_eval(<<'.,.,', 'calc.y', 23)
285
295
  def _reduce_11(val, _values, result)
286
296
  result = val[1].abs
287
297
  result
288
298
  end
289
299
  .,.,
290
300
 
291
- module_eval(<<'.,.,', 'calc.y', 23)
301
+ module_eval(<<'.,.,', 'calc.y', 24)
292
302
  def _reduce_12(val, _values, result)
293
303
  result = -val[1]
294
304
  result
295
305
  end
296
306
  .,.,
297
307
 
298
- module_eval(<<'.,.,', 'calc.y', 24)
308
+ module_eval(<<'.,.,', 'calc.y', 25)
299
309
  def _reduce_13(val, _values, result)
300
310
  result = Brain.lookup(val[0])
301
311
  result
@@ -304,14 +314,14 @@ module_eval(<<'.,.,', 'calc.y', 24)
304
314
 
305
315
  # reduce 14 omitted
306
316
 
307
- module_eval(<<'.,.,', 'calc.y', 26)
317
+ module_eval(<<'.,.,', 'calc.y', 27)
308
318
  def _reduce_15(val, _values, result)
309
319
  result = Maths::Functions.exec(val[0], val[1])
310
320
  result
311
321
  end
312
322
  .,.,
313
323
 
314
- module_eval(<<'.,.,', 'calc.y', 27)
324
+ module_eval(<<'.,.,', 'calc.y', 28)
315
325
  def _reduce_16(val, _values, result)
316
326
  result = Percentage.build(val[0], val[2])
317
327
  result
@@ -320,18 +330,25 @@ module_eval(<<'.,.,', 'calc.y', 27)
320
330
 
321
331
  module_eval(<<'.,.,', 'calc.y', 29)
322
332
  def _reduce_17(val, _values, result)
323
- result = Brain.assign(val[0], val[2])
333
+ result = Percentage.change(val[2], val[0])
324
334
  result
325
335
  end
326
336
  .,.,
327
337
 
328
- module_eval(<<'.,.,', 'calc.y', 30)
338
+ module_eval(<<'.,.,', 'calc.y', 31)
329
339
  def _reduce_18(val, _values, result)
330
340
  result = Brain.assign(val[0], val[2])
331
341
  result
332
342
  end
333
343
  .,.,
334
344
 
345
+ module_eval(<<'.,.,', 'calc.y', 32)
346
+ def _reduce_19(val, _values, result)
347
+ result = Brain.assign(val[0], val[2])
348
+ result
349
+ end
350
+ .,.,
351
+
335
352
  def _reduce_none(val, _values, result)
336
353
  val[0]
337
354
  end
data/lib/maths/calc.y CHANGED
@@ -6,6 +6,7 @@ class Calculator
6
6
  left "^" "*" '/' '%'
7
7
  left "+" "-"
8
8
  right PERCENTAGE_OF
9
+ right PERCENTAGE_TO
9
10
  right "="
10
11
  preclow
11
12
  rule
@@ -26,6 +27,7 @@ rule
26
27
  | NUMBER
27
28
  | FUNC exp { result = Maths::Functions.exec(val[0], val[1]) }
28
29
  | exp PERCENTAGE_OF exp { result = Percentage.build(val[0], val[2]) }
30
+ | exp PERCENTAGE_TO exp { result = Percentage.change(val[2], val[0]) }
29
31
 
30
32
  assign: VARIABLE "=" exp { result = Brain.assign(val[0], val[2]) }
31
33
  | VARIABLE "=" assign { result = Brain.assign(val[0], val[2]) }
@@ -55,6 +57,9 @@ module Maths
55
57
  when /\Aas % of/
56
58
  @q.push [:PERCENTAGE_OF, $&]
57
59
 
60
+ when /\Aas a % change from/
61
+ @q.push [:PERCENTAGE_TO, $&]
62
+
58
63
  # special terms
59
64
  when /\Api/
60
65
  @q.push [:NUMBER, BigDecimal.new("3.14159265358979323846264338327")]
@@ -9,5 +9,10 @@ module Maths
9
9
  denominator = BigDecimal.new(denominator.to_s)
10
10
  Percentage.new(((numerator / denominator) * 100).to_s)
11
11
  end
12
+
13
+ # Public: Calculates the % change of from to to
14
+ def self.change(from, to)
15
+ Percentage.new((((to / from) - 1) * 100).to_s)
16
+ end
12
17
  end
13
18
  end
data/lib/maths/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Maths
2
- VERSION = "0.0.10"
2
+ VERSION = "0.0.11"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: maths
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.10
4
+ version: 0.0.11
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: