opal 1.3.2 → 1.4.0.alpha1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (222) hide show
  1. checksums.yaml +4 -4
  2. data/.eslintrc.js +1 -0
  3. data/.github/workflows/build.yml +0 -3
  4. data/.rubocop.yml +5 -1
  5. data/UNRELEASED.md +66 -2
  6. data/benchmark-ips/bm_truthy.rb +30 -0
  7. data/bin/opal-mspec +1 -3
  8. data/bin/opal-repl +1 -2
  9. data/bin/remove-filters +1 -4
  10. data/docs/compiled_ruby.md +10 -6
  11. data/exe/opal-repl +1 -3
  12. data/lib/opal/ast/builder.rb +1 -1
  13. data/lib/opal/cli.rb +2 -2
  14. data/lib/opal/cli_runners/nodejs.rb +9 -2
  15. data/lib/opal/cli_runners/source-map-support-browser.js +80 -216
  16. data/lib/opal/cli_runners/source-map-support-node.js +80 -216
  17. data/lib/opal/cli_runners/source-map-support.js +5 -1
  18. data/lib/opal/cli_runners/system_runner.rb +10 -4
  19. data/lib/opal/compiler.rb +3 -5
  20. data/lib/opal/fragment.rb +5 -1
  21. data/lib/opal/nodes/args/extract_block_arg.rb +1 -8
  22. data/lib/opal/nodes/args/extract_kwoptarg.rb +1 -3
  23. data/lib/opal/nodes/args/extract_optarg.rb +1 -3
  24. data/lib/opal/nodes/args/extract_post_arg.rb +2 -5
  25. data/lib/opal/nodes/args/extract_post_optarg.rb +2 -7
  26. data/lib/opal/nodes/args/initialize_iterarg.rb +1 -3
  27. data/lib/opal/nodes/args/prepare_post_args.rb +5 -1
  28. data/lib/opal/nodes/base.rb +3 -2
  29. data/lib/opal/nodes/call.rb +20 -9
  30. data/lib/opal/nodes/call_special.rb +50 -0
  31. data/lib/opal/nodes/class.rb +24 -15
  32. data/lib/opal/nodes/constants.rb +23 -5
  33. data/lib/opal/nodes/def.rb +20 -23
  34. data/lib/opal/nodes/defined.rb +5 -5
  35. data/lib/opal/nodes/definitions.rb +2 -2
  36. data/lib/opal/nodes/defs.rb +2 -5
  37. data/lib/opal/nodes/helpers.rb +48 -18
  38. data/lib/opal/nodes/if.rb +109 -8
  39. data/lib/opal/nodes/iter.rb +23 -16
  40. data/lib/opal/nodes/literal.rb +18 -4
  41. data/lib/opal/nodes/logic.rb +2 -1
  42. data/lib/opal/nodes/masgn.rb +4 -9
  43. data/lib/opal/nodes/module.rb +29 -19
  44. data/lib/opal/nodes/node_with_args.rb +1 -7
  45. data/lib/opal/nodes/scope.rb +54 -15
  46. data/lib/opal/nodes/singleton_class.rb +5 -3
  47. data/lib/opal/nodes/super.rb +3 -3
  48. data/lib/opal/nodes/top.rb +34 -31
  49. data/lib/opal/nodes/variables.rb +2 -2
  50. data/lib/opal/nodes/x_string.rb +3 -0
  51. data/lib/opal/nodes.rb +0 -1
  52. data/lib/opal/parser/patch.rb +75 -0
  53. data/lib/opal/parser/with_ruby_lexer.rb +1 -1
  54. data/lib/opal/regexp_anchors.rb +7 -7
  55. data/lib/opal/requires.rb +19 -0
  56. data/lib/opal/rewriters/pattern_matching.rb +1 -1
  57. data/lib/opal/rewriters/returnable_logic.rb +102 -4
  58. data/lib/opal/util.rb +2 -2
  59. data/lib/opal/version.rb +1 -1
  60. data/lib/opal.rb +1 -17
  61. data/opal/corelib/array/pack.rb +11 -11
  62. data/opal/corelib/array.rb +193 -152
  63. data/opal/corelib/basic_object.rb +14 -14
  64. data/opal/corelib/binding.rb +7 -7
  65. data/opal/corelib/boolean.rb +12 -15
  66. data/opal/corelib/class.rb +23 -1
  67. data/opal/corelib/comparable.rb +8 -8
  68. data/opal/corelib/complex/base.rb +2 -2
  69. data/opal/corelib/complex.rb +79 -88
  70. data/opal/corelib/constants.rb +9 -9
  71. data/opal/corelib/dir.rb +4 -3
  72. data/opal/corelib/enumerable.rb +140 -127
  73. data/opal/corelib/enumerator/arithmetic_sequence.rb +177 -0
  74. data/opal/corelib/enumerator/chain.rb +42 -0
  75. data/opal/corelib/enumerator/generator.rb +35 -0
  76. data/opal/corelib/enumerator/lazy.rb +243 -0
  77. data/opal/corelib/enumerator/yielder.rb +36 -0
  78. data/opal/corelib/enumerator.rb +45 -300
  79. data/opal/corelib/error/errno.rb +47 -0
  80. data/opal/corelib/error.rb +62 -60
  81. data/opal/corelib/file.rb +26 -12
  82. data/opal/corelib/hash.rb +98 -107
  83. data/opal/corelib/helpers.rb +62 -13
  84. data/opal/corelib/io.rb +47 -34
  85. data/opal/corelib/kernel/format.rb +29 -29
  86. data/opal/corelib/kernel.rb +86 -83
  87. data/opal/corelib/main.rb +14 -12
  88. data/opal/corelib/marshal/read_buffer.rb +15 -15
  89. data/opal/corelib/marshal/write_buffer.rb +45 -44
  90. data/opal/corelib/marshal.rb +3 -3
  91. data/opal/corelib/math.rb +50 -50
  92. data/opal/corelib/method.rb +12 -8
  93. data/opal/corelib/module.rb +96 -79
  94. data/opal/corelib/nil.rb +9 -11
  95. data/opal/corelib/number.rb +113 -118
  96. data/opal/corelib/numeric.rb +37 -33
  97. data/opal/corelib/object_space.rb +11 -10
  98. data/opal/corelib/pack_unpack/format_string_parser.rb +3 -3
  99. data/opal/corelib/pattern_matching/base.rb +7 -7
  100. data/opal/corelib/pattern_matching.rb +1 -1
  101. data/opal/corelib/proc.rb +15 -16
  102. data/opal/corelib/process/base.rb +2 -2
  103. data/opal/corelib/process/status.rb +21 -0
  104. data/opal/corelib/process.rb +5 -5
  105. data/opal/corelib/random/formatter.rb +11 -11
  106. data/opal/corelib/random/math_random.js.rb +1 -1
  107. data/opal/corelib/random/mersenne_twister.rb +3 -3
  108. data/opal/corelib/random/seedrandom.js.rb +3 -3
  109. data/opal/corelib/random.rb +17 -17
  110. data/opal/corelib/range.rb +51 -35
  111. data/opal/corelib/rational/base.rb +4 -4
  112. data/opal/corelib/rational.rb +61 -62
  113. data/opal/corelib/regexp.rb +47 -38
  114. data/opal/corelib/runtime.js +245 -139
  115. data/opal/corelib/string/encoding.rb +21 -21
  116. data/opal/corelib/string/unpack.rb +19 -14
  117. data/opal/corelib/string.rb +135 -128
  118. data/opal/corelib/struct.rb +59 -46
  119. data/opal/corelib/time.rb +47 -57
  120. data/opal/corelib/trace_point.rb +2 -2
  121. data/opal/corelib/unsupported.rb +31 -120
  122. data/opal/corelib/variables.rb +3 -3
  123. data/opal/opal/base.rb +9 -8
  124. data/opal/opal/full.rb +8 -8
  125. data/opal/opal/mini.rb +17 -17
  126. data/opal/opal.rb +17 -18
  127. data/opal.gemspec +1 -1
  128. data/spec/filters/bugs/array.rb +4 -24
  129. data/spec/filters/bugs/bigdecimal.rb +0 -23
  130. data/spec/filters/bugs/binding.rb +0 -1
  131. data/spec/filters/bugs/boolean.rb +3 -0
  132. data/spec/filters/bugs/class.rb +2 -0
  133. data/spec/filters/bugs/date.rb +0 -5
  134. data/spec/filters/bugs/encoding.rb +8 -50
  135. data/spec/filters/bugs/enumerable.rb +4 -1
  136. data/spec/filters/bugs/enumerator.rb +3 -36
  137. data/spec/filters/bugs/exception.rb +0 -2
  138. data/spec/filters/bugs/file.rb +0 -2
  139. data/spec/filters/bugs/float.rb +0 -3
  140. data/spec/filters/bugs/hash.rb +5 -3
  141. data/spec/filters/bugs/integer.rb +2 -3
  142. data/spec/filters/bugs/kernel.rb +2 -31
  143. data/spec/filters/bugs/language.rb +29 -49
  144. data/spec/filters/bugs/main.rb +0 -2
  145. data/spec/filters/bugs/marshal.rb +2 -3
  146. data/spec/filters/bugs/matrix.rb +0 -36
  147. data/spec/filters/bugs/module.rb +7 -61
  148. data/spec/filters/bugs/numeric.rb +0 -7
  149. data/spec/filters/bugs/objectspace.rb +1 -1
  150. data/spec/filters/bugs/pack_unpack.rb +0 -4
  151. data/spec/filters/bugs/proc.rb +0 -9
  152. data/spec/filters/bugs/random.rb +0 -5
  153. data/spec/filters/bugs/range.rb +1 -6
  154. data/spec/filters/bugs/regexp.rb +0 -3
  155. data/spec/filters/bugs/set.rb +8 -1
  156. data/spec/filters/bugs/string.rb +9 -34
  157. data/spec/filters/bugs/stringscanner.rb +8 -7
  158. data/spec/filters/bugs/struct.rb +2 -3
  159. data/spec/filters/bugs/symbol.rb +0 -1
  160. data/spec/filters/bugs/time.rb +0 -8
  161. data/spec/filters/bugs/unboundmethod.rb +0 -8
  162. data/spec/filters/bugs/warnings.rb +1 -7
  163. data/spec/filters/unsupported/freeze.rb +24 -0
  164. data/spec/filters/unsupported/integer.rb +1 -0
  165. data/spec/filters/unsupported/kernel.rb +12 -0
  166. data/spec/filters/unsupported/privacy.rb +3 -0
  167. data/spec/filters/unsupported/string.rb +2 -0
  168. data/spec/lib/builder_spec.rb +2 -2
  169. data/spec/lib/cli_spec.rb +1 -1
  170. data/spec/lib/compiler_spec.rb +37 -37
  171. data/spec/lib/simple_server_spec.rb +2 -2
  172. data/spec/lib/source_map/file_spec.rb +1 -1
  173. data/spec/opal/compiler/irb_spec.rb +2 -2
  174. data/spec/opal/core/kernel/puts_spec.rb +90 -0
  175. data/spec/opal/core/language/super_spec.rb +24 -0
  176. data/spec/ruby_specs +4 -2
  177. data/spec/support/rewriters_helper.rb +1 -1
  178. data/stdlib/bigdecimal.rb +7 -11
  179. data/stdlib/buffer/view.rb +2 -2
  180. data/stdlib/buffer.rb +2 -2
  181. data/stdlib/date.rb +5 -6
  182. data/stdlib/erb.rb +1 -0
  183. data/stdlib/js.rb +2 -1
  184. data/stdlib/native.rb +7 -8
  185. data/stdlib/nodejs/argf.rb +4 -4
  186. data/stdlib/nodejs/base.rb +29 -0
  187. data/stdlib/nodejs/dir.rb +1 -1
  188. data/stdlib/nodejs/env.rb +6 -9
  189. data/stdlib/nodejs/file.rb +23 -17
  190. data/stdlib/nodejs/fileutils.rb +3 -3
  191. data/stdlib/nodejs/io.rb +2 -20
  192. data/stdlib/nodejs/irb.rb +0 -0
  193. data/stdlib/nodejs/kernel.rb +2 -37
  194. data/stdlib/nodejs.rb +1 -3
  195. data/stdlib/opal/miniracer.rb +2 -0
  196. data/stdlib/opal/platform.rb +6 -13
  197. data/stdlib/opal/replutils.rb +16 -5
  198. data/stdlib/opal-parser.rb +2 -2
  199. data/stdlib/optparse/ac.rb +54 -0
  200. data/stdlib/optparse/date.rb +14 -0
  201. data/stdlib/optparse/kwargs.rb +22 -0
  202. data/stdlib/optparse/shellwords.rb +7 -0
  203. data/stdlib/optparse/time.rb +15 -0
  204. data/stdlib/optparse/uri.rb +7 -0
  205. data/stdlib/optparse/version.rb +69 -0
  206. data/stdlib/optparse.rb +2279 -0
  207. data/stdlib/pathname.rb +5 -6
  208. data/stdlib/pp.rb +18 -2
  209. data/stdlib/promise/v2.rb +18 -22
  210. data/stdlib/promise.rb +15 -21
  211. data/stdlib/set.rb +32 -32
  212. data/stdlib/shellwords.rb +240 -0
  213. data/stdlib/stringio.rb +3 -6
  214. data/stdlib/strscan.rb +5 -8
  215. data/stdlib/template.rb +2 -2
  216. data/stdlib/thread.rb +7 -9
  217. data/tasks/performance.rake +5 -2
  218. data/tasks/testing/mspec_special_calls.rb +0 -12
  219. data/tasks/testing.rake +55 -37
  220. data/test/nodejs/test_file.rb +11 -0
  221. metadata +55 -10
  222. data/lib/opal/nodes/case.rb +0 -114
@@ -1,6 +1,6 @@
1
- # helpers: falsy, truthy, coerce_to
1
+ # helpers: truthy, coerce_to, yield1, yieldX
2
2
 
3
- module Enumerable
3
+ module ::Enumerable
4
4
  %x{
5
5
  function comparableForPattern(value) {
6
6
  if (value.length === 0) {
@@ -30,7 +30,7 @@ module Enumerable
30
30
  end
31
31
  else
32
32
  each do |*value|
33
- unless Opal.destructure(value)
33
+ unless ::Opal.destructure(value)
34
34
  return false
35
35
  end
36
36
  end
@@ -54,7 +54,7 @@ module Enumerable
54
54
  end
55
55
  else
56
56
  each do |*value|
57
- if Opal.destructure(value)
57
+ if ::Opal.destructure(value)
58
58
  return true
59
59
  end
60
60
  end
@@ -77,7 +77,7 @@ module Enumerable
77
77
  }
78
78
 
79
79
  self.$each.$$p = function(value) {
80
- var key = Opal.yield1(block, value);
80
+ var key = $yield1(block, value);
81
81
 
82
82
  if (key === nil) {
83
83
  releaseAccumulate();
@@ -103,7 +103,7 @@ module Enumerable
103
103
  end
104
104
 
105
105
  def chunk_while(&block)
106
- raise ArgumentError, 'no block given' unless block_given?
106
+ ::Kernel.raise ::ArgumentError, 'no block given' unless block_given?
107
107
 
108
108
  slice_when { |before, after| !(yield before, after) }
109
109
  end
@@ -115,7 +115,7 @@ module Enumerable
115
115
  var result = [];
116
116
 
117
117
  self.$each.$$p = function() {
118
- var value = Opal.yieldX(block, arguments);
118
+ var value = $yieldX(block, arguments);
119
119
 
120
120
  result.push(value);
121
121
  };
@@ -131,6 +131,10 @@ module Enumerable
131
131
  map { |item| yield item }.flatten(1)
132
132
  end
133
133
 
134
+ def compact
135
+ to_a.compact
136
+ end
137
+
134
138
  def count(object = undefined, &block)
135
139
  result = 0
136
140
 
@@ -141,15 +145,15 @@ module Enumerable
141
145
  }
142
146
 
143
147
  if `object != null`
144
- block = proc do |*args|
145
- Opal.destructure(args) == object
148
+ block = ::Kernel.proc do |*args|
149
+ ::Opal.destructure(args) == object
146
150
  end
147
151
  elsif block.nil?
148
- block = proc { true }
152
+ block = ::Kernel.proc { true }
149
153
  end
150
154
 
151
155
  each do |*args|
152
- `result++` if `Opal.yieldX(block, args)`
156
+ `result++` if `$yieldX(block, args)`
153
157
  end
154
158
 
155
159
  result
@@ -159,16 +163,16 @@ module Enumerable
159
163
  unless block_given?
160
164
  return enum_for(:cycle, n) do
161
165
  if n.nil?
162
- respond_to?(:size) ? Float::INFINITY : nil
166
+ respond_to?(:size) ? ::Float::INFINITY : nil
163
167
  else
164
- n = Opal.coerce_to!(n, Integer, :to_int)
168
+ n = ::Opal.coerce_to!(n, ::Integer, :to_int)
165
169
  n > 0 ? enumerator_size * n : 0
166
170
  end
167
171
  end
168
172
  end
169
173
 
170
174
  unless n.nil?
171
- n = Opal.coerce_to! n, Integer, :to_int
175
+ n = ::Opal.coerce_to! n, ::Integer, :to_int
172
176
 
173
177
  return if `n <= 0`
174
178
  end
@@ -177,8 +181,8 @@ module Enumerable
177
181
  var all = [], i, length, value;
178
182
 
179
183
  self.$each.$$p = function() {
180
- var param = #{Opal.destructure(`arguments`)},
181
- value = Opal.yield1(block, param);
184
+ var param = #{::Opal.destructure(`arguments`)},
185
+ value = $yield1(block, param);
182
186
 
183
187
  all.push(param);
184
188
  }
@@ -192,14 +196,14 @@ module Enumerable
192
196
  if (n === nil) {
193
197
  while (true) {
194
198
  for (i = 0, length = all.length; i < length; i++) {
195
- value = Opal.yield1(block, all[i]);
199
+ value = $yield1(block, all[i]);
196
200
  }
197
201
  }
198
202
  }
199
203
  else {
200
204
  while (n > 1) {
201
205
  for (i = 0, length = all.length; i < length; i++) {
202
- value = Opal.yield1(block, all[i]);
206
+ value = $yield1(block, all[i]);
203
207
  }
204
208
 
205
209
  n--;
@@ -212,7 +216,7 @@ module Enumerable
212
216
  return enum_for :detect, ifnone unless block_given?
213
217
 
214
218
  each do |*args|
215
- value = Opal.destructure(args)
219
+ value = ::Opal.destructure(args)
216
220
  if yield(value)
217
221
  return value
218
222
  end
@@ -232,10 +236,10 @@ module Enumerable
232
236
  end
233
237
 
234
238
  def drop(number)
235
- number = `$coerce_to(number, #{Integer}, 'to_int')`
239
+ number = `$coerce_to(number, #{::Integer}, 'to_int')`
236
240
 
237
241
  if `number < 0`
238
- raise ArgumentError, 'attempt to drop negative size'
242
+ ::Kernel.raise ::ArgumentError, 'attempt to drop negative size'
239
243
  end
240
244
 
241
245
  %x{
@@ -244,7 +248,7 @@ module Enumerable
244
248
 
245
249
  self.$each.$$p = function() {
246
250
  if (number <= current) {
247
- result.push(#{Opal.destructure(`arguments`)});
251
+ result.push(#{::Opal.destructure(`arguments`)});
248
252
  }
249
253
 
250
254
  current++;
@@ -264,12 +268,12 @@ module Enumerable
264
268
  dropping = true;
265
269
 
266
270
  self.$each.$$p = function() {
267
- var param = #{Opal.destructure(`arguments`)};
271
+ var param = #{::Opal.destructure(`arguments`)};
268
272
 
269
273
  if (dropping) {
270
- var value = Opal.yield1(block, param);
274
+ var value = $yield1(block, param);
271
275
 
272
- if ($falsy(value)) {
276
+ if (!$truthy(value)) {
273
277
  dropping = false;
274
278
  result.push(param);
275
279
  }
@@ -287,13 +291,13 @@ module Enumerable
287
291
 
288
292
  def each_cons(n, &block)
289
293
  if `arguments.length != 1`
290
- raise ArgumentError, "wrong number of arguments (#{`arguments.length`} for 1)"
294
+ ::Kernel.raise ::ArgumentError, "wrong number of arguments (#{`arguments.length`} for 1)"
291
295
  end
292
296
 
293
- n = Opal.try_convert n, Integer, :to_int
297
+ n = ::Opal.try_convert n, ::Integer, :to_int
294
298
 
295
299
  if `n <= 0`
296
- raise ArgumentError, 'invalid size'
300
+ ::Kernel.raise ::ArgumentError, 'invalid size'
297
301
  end
298
302
 
299
303
  unless block_given?
@@ -313,19 +317,19 @@ module Enumerable
313
317
  var buffer = [];
314
318
 
315
319
  self.$each.$$p = function() {
316
- var element = #{Opal.destructure(`arguments`)};
320
+ var element = #{::Opal.destructure(`arguments`)};
317
321
  buffer.push(element);
318
322
  if (buffer.length > n) {
319
323
  buffer.shift();
320
324
  }
321
325
  if (buffer.length == n) {
322
- Opal.yield1(block, buffer.slice(0, n));
326
+ $yield1(block, buffer.slice(0, n));
323
327
  }
324
328
  }
325
329
 
326
330
  self.$each();
327
331
 
328
- return nil;
332
+ return self;
329
333
  }
330
334
  end
331
335
 
@@ -336,9 +340,9 @@ module Enumerable
336
340
 
337
341
  %x{
338
342
  self.$each.$$p = function() {
339
- var item = #{Opal.destructure(`arguments`)};
343
+ var item = #{::Opal.destructure(`arguments`)};
340
344
 
341
- Opal.yield1(block, item);
345
+ $yield1(block, item);
342
346
  }
343
347
 
344
348
  self.$each.apply(self, data);
@@ -348,10 +352,10 @@ module Enumerable
348
352
  end
349
353
 
350
354
  def each_slice(n, &block)
351
- n = `$coerce_to(#{n}, #{Integer}, 'to_int')`
355
+ n = `$coerce_to(#{n}, #{::Integer}, 'to_int')`
352
356
 
353
357
  if `n <= 0`
354
- raise ArgumentError, 'invalid slice size'
358
+ ::Kernel.raise ::ArgumentError, 'invalid slice size'
355
359
  end
356
360
 
357
361
  return enum_for(:each_slice, n) { respond_to?(:size) ? (size / n).ceil : nil } unless block_given?
@@ -360,12 +364,12 @@ module Enumerable
360
364
  var slice = []
361
365
 
362
366
  self.$each.$$p = function() {
363
- var param = #{Opal.destructure(`arguments`)};
367
+ var param = #{::Opal.destructure(`arguments`)};
364
368
 
365
369
  slice.push(param);
366
370
 
367
371
  if (slice.length === n) {
368
- Opal.yield1(block, slice);
372
+ $yield1(block, slice);
369
373
  slice = [];
370
374
  }
371
375
  };
@@ -374,11 +378,11 @@ module Enumerable
374
378
 
375
379
  // our "last" group, if smaller than n then won't have been yielded
376
380
  if (slice.length > 0) {
377
- Opal.yield1(block, slice);
381
+ $yield1(block, slice);
378
382
  }
379
383
  }
380
384
 
381
- nil
385
+ self
382
386
  end
383
387
 
384
388
  def each_with_index(*args, &block)
@@ -388,7 +392,7 @@ module Enumerable
388
392
  var index = 0;
389
393
 
390
394
  self.$each.$$p = function() {
391
- var param = #{Opal.destructure(`arguments`)};
395
+ var param = #{::Opal.destructure(`arguments`)};
392
396
 
393
397
  block(param, index);
394
398
 
@@ -406,7 +410,7 @@ module Enumerable
406
410
 
407
411
  %x{
408
412
  self.$each.$$p = function() {
409
- var param = #{Opal.destructure(`arguments`)};
413
+ var param = #{::Opal.destructure(`arguments`)};
410
414
 
411
415
  block(param, object);
412
416
  };
@@ -422,7 +426,7 @@ module Enumerable
422
426
  var result = [];
423
427
 
424
428
  self.$each.$$p = function() {
425
- result.push(#{Opal.destructure(`arguments`)});
429
+ result.push(#{::Opal.destructure(`arguments`)});
426
430
  };
427
431
 
428
432
  self.$each.apply(self, args);
@@ -437,8 +441,6 @@ module Enumerable
437
441
  map(&block).select(&:itself)
438
442
  end
439
443
 
440
- alias find detect
441
-
442
444
  def find_all(&block)
443
445
  return enum_for(:find_all) { enumerator_size } unless block_given?
444
446
 
@@ -446,8 +448,8 @@ module Enumerable
446
448
  var result = [];
447
449
 
448
450
  self.$each.$$p = function() {
449
- var param = #{Opal.destructure(`arguments`)},
450
- value = Opal.yield1(block, param);
451
+ var param = #{::Opal.destructure(`arguments`)},
452
+ value = $yield1(block, param);
451
453
 
452
454
  if ($truthy(value)) {
453
455
  result.push(param);
@@ -460,8 +462,6 @@ module Enumerable
460
462
  }
461
463
  end
462
464
 
463
- alias filter find_all
464
-
465
465
  def find_index(object = undefined, &block)
466
466
  return enum_for :find_index if `object === undefined && block === nil`
467
467
 
@@ -475,7 +475,7 @@ module Enumerable
475
475
 
476
476
  if `object != null`
477
477
  each do |*value|
478
- if Opal.destructure(value) == object
478
+ if ::Opal.destructure(value) == object
479
479
  return index
480
480
  end
481
481
 
@@ -501,10 +501,10 @@ module Enumerable
501
501
  end
502
502
  else
503
503
  result = []
504
- number = `$coerce_to(number, #{Integer}, 'to_int')`
504
+ number = `$coerce_to(number, #{::Integer}, 'to_int')`
505
505
 
506
506
  if `number < 0`
507
- raise ArgumentError, 'attempt to take negative size'
507
+ ::Kernel.raise ::ArgumentError, 'attempt to take negative size'
508
508
  end
509
509
 
510
510
  if `number == 0`
@@ -514,7 +514,7 @@ module Enumerable
514
514
  current = 0
515
515
 
516
516
  each do |*args|
517
- `result.push(#{Opal.destructure(args)})`
517
+ `result.push(#{::Opal.destructure(args)})`
518
518
 
519
519
  if `number <= ++current`
520
520
  return result
@@ -525,8 +525,6 @@ module Enumerable
525
525
  end
526
526
  end
527
527
 
528
- alias flat_map collect_concat
529
-
530
528
  def grep(pattern, &block)
531
529
  result = []
532
530
 
@@ -574,8 +572,8 @@ module Enumerable
574
572
  var result;
575
573
 
576
574
  self.$each.$$p = function() {
577
- var param = #{Opal.destructure(`arguments`)},
578
- value = Opal.yield1(block, param);
575
+ var param = #{::Opal.destructure(`arguments`)},
576
+ value = $yield1(block, param);
579
577
 
580
578
  #{(hash[`value`] ||= []) << `param`};
581
579
  }
@@ -592,7 +590,7 @@ module Enumerable
592
590
 
593
591
  def include?(obj)
594
592
  each do |*args|
595
- if Opal.destructure(args) == obj
593
+ if ::Opal.destructure(args) == obj
596
594
  return true
597
595
  end
598
596
  end
@@ -606,22 +604,22 @@ module Enumerable
606
604
 
607
605
  if (block !== nil && sym === undefined) {
608
606
  self.$each.$$p = function() {
609
- var value = #{Opal.destructure(`arguments`)};
607
+ var value = #{::Opal.destructure(`arguments`)};
610
608
 
611
609
  if (result === undefined) {
612
610
  result = value;
613
611
  return;
614
612
  }
615
613
 
616
- value = Opal.yieldX(block, [result, value]);
614
+ value = $yieldX(block, [result, value]);
617
615
 
618
616
  result = value;
619
617
  };
620
618
  }
621
619
  else {
622
620
  if (sym === undefined) {
623
- if (!#{Symbol === object}) {
624
- #{raise TypeError, "#{object.inspect} is not a Symbol"};
621
+ if (!#{::Symbol === object}) {
622
+ #{::Kernel.raise ::TypeError, "#{object.inspect} is not a Symbol"};
625
623
  }
626
624
 
627
625
  sym = object;
@@ -629,7 +627,7 @@ module Enumerable
629
627
  }
630
628
 
631
629
  self.$each.$$p = function() {
632
- var value = #{Opal.destructure(`arguments`)};
630
+ var value = #{::Opal.destructure(`arguments`)};
633
631
 
634
632
  if (result === undefined) {
635
633
  result = value;
@@ -647,7 +645,7 @@ module Enumerable
647
645
  end
648
646
 
649
647
  def lazy
650
- Enumerator::Lazy.new(self, enumerator_size) do |enum, *args|
648
+ ::Enumerator::Lazy.new(self, enumerator_size) do |enum, *args|
651
649
  enum.yield(*args)
652
650
  end
653
651
  end
@@ -656,15 +654,13 @@ module Enumerable
656
654
  respond_to?(:size) ? size : nil
657
655
  end
658
656
 
659
- alias map collect
660
-
661
657
  def max(n = undefined, &block)
662
658
  %x{
663
659
  if (n === undefined || n === nil) {
664
660
  var result, value;
665
661
 
666
662
  self.$each.$$p = function() {
667
- var item = #{Opal.destructure(`arguments`)};
663
+ var item = #{::Opal.destructure(`arguments`)};
668
664
 
669
665
  if (result === undefined) {
670
666
  result = item;
@@ -672,13 +668,13 @@ module Enumerable
672
668
  }
673
669
 
674
670
  if (block !== nil) {
675
- value = Opal.yieldX(block, [item, result]);
671
+ value = $yieldX(block, [item, result]);
676
672
  } else {
677
673
  value = #{`item` <=> `result`};
678
674
  }
679
675
 
680
676
  if (value === nil) {
681
- #{raise ArgumentError, 'comparison failed'};
677
+ #{::Kernel.raise ::ArgumentError, 'comparison failed'};
682
678
  }
683
679
 
684
680
  if (value > 0) {
@@ -695,7 +691,7 @@ module Enumerable
695
691
  }
696
692
  }
697
693
 
698
- n = $coerce_to(n, #{Integer}, 'to_int');
694
+ n = $coerce_to(n, #{::Integer}, 'to_int');
699
695
  }
700
696
 
701
697
  sort(&block).reverse.first(n)
@@ -713,8 +709,8 @@ module Enumerable
713
709
  by;
714
710
 
715
711
  self.$each.$$p = function() {
716
- var param = #{Opal.destructure(`arguments`)},
717
- value = Opal.yield1(block, param);
712
+ var param = #{::Opal.destructure(`arguments`)},
713
+ value = $yield1(block, param);
718
714
 
719
715
  if (result === undefined) {
720
716
  result = param;
@@ -734,8 +730,6 @@ module Enumerable
734
730
  }
735
731
  end
736
732
 
737
- alias member? include?
738
-
739
733
  def min(n = nil, &block)
740
734
  unless n.nil?
741
735
  if block_given?
@@ -750,7 +744,7 @@ module Enumerable
750
744
 
751
745
  if (block !== nil) {
752
746
  self.$each.$$p = function() {
753
- var param = #{Opal.destructure(`arguments`)};
747
+ var param = #{::Opal.destructure(`arguments`)};
754
748
 
755
749
  if (result === undefined) {
756
750
  result = param;
@@ -760,7 +754,7 @@ module Enumerable
760
754
  var value = block(param, result);
761
755
 
762
756
  if (value === nil) {
763
- #{raise ArgumentError, 'comparison failed'};
757
+ #{::Kernel.raise ::ArgumentError, 'comparison failed'};
764
758
  }
765
759
 
766
760
  if (value < 0) {
@@ -770,14 +764,14 @@ module Enumerable
770
764
  }
771
765
  else {
772
766
  self.$each.$$p = function() {
773
- var param = #{Opal.destructure(`arguments`)};
767
+ var param = #{::Opal.destructure(`arguments`)};
774
768
 
775
769
  if (result === undefined) {
776
770
  result = param;
777
771
  return;
778
772
  }
779
773
 
780
- if (#{Opal.compare(`param`, `result`)} < 0) {
774
+ if (#{::Opal.compare(`param`, `result`)} < 0) {
781
775
  result = param;
782
776
  }
783
777
  };
@@ -801,8 +795,8 @@ module Enumerable
801
795
  by;
802
796
 
803
797
  self.$each.$$p = function() {
804
- var param = #{Opal.destructure(`arguments`)},
805
- value = Opal.yield1(block, param);
798
+ var param = #{::Opal.destructure(`arguments`)},
799
+ value = $yield1(block, param);
806
800
 
807
801
  if (result === undefined) {
808
802
  result = param;
@@ -823,13 +817,13 @@ module Enumerable
823
817
  end
824
818
 
825
819
  def minmax(&block)
826
- block ||= proc { |a, b| a <=> b }
820
+ block ||= ::Kernel.proc { |a, b| a <=> b }
827
821
 
828
822
  %x{
829
823
  var min = nil, max = nil, first_time = true;
830
824
 
831
825
  self.$each.$$p = function() {
832
- var element = #{Opal.destructure(`arguments`)};
826
+ var element = #{::Opal.destructure(`arguments`)};
833
827
  if (first_time) {
834
828
  min = max = element;
835
829
  first_time = false;
@@ -837,7 +831,7 @@ module Enumerable
837
831
  var min_cmp = #{block.call(`min`, `element`)};
838
832
 
839
833
  if (min_cmp === nil) {
840
- #{raise ArgumentError, 'comparison failed'}
834
+ #{::Kernel.raise ::ArgumentError, 'comparison failed'}
841
835
  } else if (min_cmp > 0) {
842
836
  min = element;
843
837
  }
@@ -845,7 +839,7 @@ module Enumerable
845
839
  var max_cmp = #{block.call(`max`, `element`)};
846
840
 
847
841
  if (max_cmp === nil) {
848
- #{raise ArgumentError, 'comparison failed'}
842
+ #{::Kernel.raise ::ArgumentError, 'comparison failed'}
849
843
  } else if (max_cmp < 0) {
850
844
  max = element;
851
845
  }
@@ -868,8 +862,8 @@ module Enumerable
868
862
  max_by;
869
863
 
870
864
  self.$each.$$p = function() {
871
- var param = #{Opal.destructure(`arguments`)},
872
- value = Opal.yield1(block, param);
865
+ var param = #{::Opal.destructure(`arguments`)},
866
+ value = $yield1(block, param);
873
867
 
874
868
  if ((min_by === undefined) || #{`value` <=> `min_by`} < 0) {
875
869
  min_result = param;
@@ -903,7 +897,7 @@ module Enumerable
903
897
  end
904
898
  else
905
899
  each do |*value|
906
- item = Opal.destructure(value)
900
+ item = ::Opal.destructure(value)
907
901
 
908
902
  return false if item
909
903
  end
@@ -933,7 +927,7 @@ module Enumerable
933
927
  end
934
928
  else
935
929
  each do |*value|
936
- next unless Opal.destructure(value)
930
+ next unless ::Opal.destructure(value)
937
931
  count += 1
938
932
 
939
933
  return false if count > 1
@@ -950,8 +944,8 @@ module Enumerable
950
944
  var truthy = [], falsy = [], result;
951
945
 
952
946
  self.$each.$$p = function() {
953
- var param = #{Opal.destructure(`arguments`)},
954
- value = Opal.yield1(block, param);
947
+ var param = #{::Opal.destructure(`arguments`)},
948
+ value = $yield1(block, param);
955
949
 
956
950
  if ($truthy(value)) {
957
951
  truthy.push(param);
@@ -967,8 +961,6 @@ module Enumerable
967
961
  }
968
962
  end
969
963
 
970
- alias reduce inject
971
-
972
964
  def reject(&block)
973
965
  return enum_for(:reject) { enumerator_size } unless block_given?
974
966
 
@@ -976,10 +968,10 @@ module Enumerable
976
968
  var result = [];
977
969
 
978
970
  self.$each.$$p = function() {
979
- var param = #{Opal.destructure(`arguments`)},
980
- value = Opal.yield1(block, param);
971
+ var param = #{::Opal.destructure(`arguments`)},
972
+ value = $yield1(block, param);
981
973
 
982
- if ($falsy(value)) {
974
+ if (!$truthy(value)) {
983
975
  result.push(param);
984
976
  }
985
977
  };
@@ -1003,33 +995,31 @@ module Enumerable
1003
995
  self.$each();
1004
996
 
1005
997
  for (var i = result.length - 1; i >= 0; i--) {
1006
- Opal.yieldX(block, result[i]);
998
+ $yieldX(block, result[i]);
1007
999
  }
1008
1000
 
1009
1001
  return result;
1010
1002
  }
1011
1003
  end
1012
1004
 
1013
- alias select find_all
1014
-
1015
1005
  def slice_before(pattern = undefined, &block)
1016
1006
  if `pattern === undefined && block === nil`
1017
- raise ArgumentError, 'both pattern and block are given'
1007
+ ::Kernel.raise ::ArgumentError, 'both pattern and block are given'
1018
1008
  end
1019
1009
 
1020
1010
  if `pattern !== undefined && block !== nil || arguments.length > 1`
1021
- raise ArgumentError, "wrong number of arguments (#{`arguments.length`} expected 1)"
1011
+ ::Kernel.raise ::ArgumentError, "wrong number of arguments (#{`arguments.length`} expected 1)"
1022
1012
  end
1023
1013
 
1024
- Enumerator.new do |e|
1014
+ ::Enumerator.new do |e|
1025
1015
  %x{
1026
1016
  var slice = [];
1027
1017
 
1028
1018
  if (block !== nil) {
1029
1019
  if (pattern === undefined) {
1030
1020
  self.$each.$$p = function() {
1031
- var param = #{Opal.destructure(`arguments`)},
1032
- value = Opal.yield1(block, param);
1021
+ var param = #{::Opal.destructure(`arguments`)},
1022
+ value = $yield1(block, param);
1033
1023
 
1034
1024
  if ($truthy(value) && slice.length > 0) {
1035
1025
  #{e << `slice`};
@@ -1041,7 +1031,7 @@ module Enumerable
1041
1031
  }
1042
1032
  else {
1043
1033
  self.$each.$$p = function() {
1044
- var param = #{Opal.destructure(`arguments`)},
1034
+ var param = #{::Opal.destructure(`arguments`)},
1045
1035
  value = block(param, #{pattern.dup});
1046
1036
 
1047
1037
  if ($truthy(value) && slice.length > 0) {
@@ -1055,7 +1045,7 @@ module Enumerable
1055
1045
  }
1056
1046
  else {
1057
1047
  self.$each.$$p = function() {
1058
- var param = #{Opal.destructure(`arguments`)},
1048
+ var param = #{::Opal.destructure(`arguments`)},
1059
1049
  value = #{pattern === `param`};
1060
1050
 
1061
1051
  if ($truthy(value) && slice.length > 0) {
@@ -1078,24 +1068,24 @@ module Enumerable
1078
1068
 
1079
1069
  def slice_after(pattern = undefined, &block)
1080
1070
  if `pattern === undefined && block === nil`
1081
- raise ArgumentError, 'both pattern and block are given'
1071
+ ::Kernel.raise ::ArgumentError, 'both pattern and block are given'
1082
1072
  end
1083
1073
 
1084
1074
  if `pattern !== undefined && block !== nil || arguments.length > 1`
1085
- raise ArgumentError, "wrong number of arguments (#{`arguments.length`} expected 1)"
1075
+ ::Kernel.raise ::ArgumentError, "wrong number of arguments (#{`arguments.length`} expected 1)"
1086
1076
  end
1087
1077
 
1088
1078
  if `pattern !== undefined`
1089
- block = proc { |e| pattern === e }
1079
+ block = ::Kernel.proc { |e| pattern === e }
1090
1080
  end
1091
1081
 
1092
- Enumerator.new do |yielder|
1082
+ ::Enumerator.new do |yielder|
1093
1083
  %x{
1094
1084
  var accumulate;
1095
1085
 
1096
1086
  self.$each.$$p = function() {
1097
- var element = #{Opal.destructure(`arguments`)},
1098
- end_chunk = Opal.yield1(block, element);
1087
+ var element = #{::Opal.destructure(`arguments`)},
1088
+ end_chunk = $yield1(block, element);
1099
1089
 
1100
1090
  if (accumulate == null) {
1101
1091
  accumulate = [];
@@ -1120,17 +1110,17 @@ module Enumerable
1120
1110
  end
1121
1111
 
1122
1112
  def slice_when(&block)
1123
- raise ArgumentError, 'wrong number of arguments (0 for 1)' unless block_given?
1113
+ ::Kernel.raise ::ArgumentError, 'wrong number of arguments (0 for 1)' unless block_given?
1124
1114
 
1125
- Enumerator.new do |yielder|
1115
+ ::Enumerator.new do |yielder|
1126
1116
  %x{
1127
1117
  var slice = nil, last_after = nil;
1128
1118
 
1129
1119
  self.$each_cons.$$p = function() {
1130
- var params = #{Opal.destructure(`arguments`)},
1120
+ var params = #{::Opal.destructure(`arguments`)},
1131
1121
  before = params[0],
1132
1122
  after = params[1],
1133
- match = Opal.yieldX(block, [before, after]);
1123
+ match = $yieldX(block, [before, after]);
1134
1124
 
1135
1125
  last_after = after;
1136
1126
 
@@ -1167,23 +1157,33 @@ module Enumerable
1167
1157
  return enum_for(:sort_by) { enumerator_size } unless block_given?
1168
1158
 
1169
1159
  dup = map do
1170
- arg = Opal.destructure(`arguments`)
1160
+ arg = ::Opal.destructure(`arguments`)
1171
1161
  [yield(arg), arg]
1172
1162
  end
1173
1163
  dup.sort! { |a, b| `a[0]` <=> `b[0]` }
1174
1164
  dup.map! { |i| `i[1]` }
1175
1165
  end
1176
1166
 
1167
+ # This method implements the Kahan summation algorithm if it is possible to apply one.
1177
1168
  def sum(initial = 0)
1178
1169
  result = initial
1170
+ compensation = 0
1179
1171
 
1180
1172
  each do |*args|
1181
1173
  item = if block_given?
1182
1174
  yield(*args)
1183
1175
  else
1184
- Opal.destructure(args)
1176
+ ::Opal.destructure(args)
1185
1177
  end
1186
- result += item
1178
+
1179
+ if ![::Float::INFINITY, -::Float::INFINITY].include?(item) && item.respond_to?(:-)
1180
+ y = item - compensation
1181
+ t = result + y
1182
+ compensation = (t - result) - y
1183
+ result = t
1184
+ else
1185
+ result += item
1186
+ end
1187
1187
  end
1188
1188
 
1189
1189
  result
@@ -1199,7 +1199,7 @@ module Enumerable
1199
1199
  result = []
1200
1200
 
1201
1201
  each do |*args|
1202
- value = Opal.destructure(args)
1202
+ value = ::Opal.destructure(args)
1203
1203
 
1204
1204
  unless yield(value)
1205
1205
  return result
@@ -1213,7 +1213,7 @@ module Enumerable
1213
1213
  hash = {}
1214
1214
 
1215
1215
  each do |*args|
1216
- value = Opal.destructure(args)
1216
+ value = ::Opal.destructure(args)
1217
1217
 
1218
1218
  produced = if block_given?
1219
1219
  yield(value)
@@ -1229,12 +1229,16 @@ module Enumerable
1229
1229
  hash.values
1230
1230
  end
1231
1231
 
1232
- def tally
1233
- group_by(&:itself).transform_values(&:count)
1232
+ def tally(hash = undefined)
1233
+ out = group_by(&:itself).transform_values(&:count)
1234
+ if hash
1235
+ out.each { |k, v| hash[k] = hash.fetch(k, 0) + v }
1236
+ hash
1237
+ else
1238
+ out
1239
+ end
1234
1240
  end
1235
1241
 
1236
- alias to_a entries
1237
-
1238
1242
  def to_h(*args, &block)
1239
1243
  return map(&block).to_h(*args) if block_given?
1240
1244
 
@@ -1242,13 +1246,13 @@ module Enumerable
1242
1246
  var hash = #{{}};
1243
1247
 
1244
1248
  self.$each.$$p = function() {
1245
- var param = #{Opal.destructure(`arguments`)};
1246
- var ary = #{Opal.coerce_to?(`param`, Array, :to_ary)}, key, val;
1249
+ var param = #{::Opal.destructure(`arguments`)};
1250
+ var ary = #{::Opal.coerce_to?(`param`, ::Array, :to_ary)}, key, val;
1247
1251
  if (!ary.$$is_array) {
1248
- #{raise TypeError, "wrong element type #{`ary`.class} (expected array)"}
1252
+ #{::Kernel.raise ::TypeError, "wrong element type #{`ary`.class} (expected array)"}
1249
1253
  }
1250
1254
  if (ary.length !== 2) {
1251
- #{raise ArgumentError, "wrong array length (expected 2, was #{`ary`.length})"}
1255
+ #{::Kernel.raise ::ArgumentError, "wrong array length (expected 2, was #{`ary`.length})"}
1252
1256
  }
1253
1257
  key = ary[0];
1254
1258
  val = ary[1];
@@ -1265,4 +1269,13 @@ module Enumerable
1265
1269
  def zip(*others, &block)
1266
1270
  to_a.zip(*others)
1267
1271
  end
1272
+
1273
+ alias find detect
1274
+ alias filter find_all
1275
+ alias flat_map collect_concat
1276
+ alias map collect
1277
+ alias member? include?
1278
+ alias reduce inject
1279
+ alias select find_all
1280
+ alias to_a entries
1268
1281
  end