feat: implement single-argument reduce with manual iteration and empty-sequence abort

Replace the previous slice-based single-argument reduce implementation with an explicit iterator loop that seeds from the first element. This avoids the out-of-bounds range error on single-element lists and adds a Fiber.abort for empty sequences. Update the test to verify correct behavior for single-element and empty sequences.
This commit is contained in:
Luchs
2015-01-16 08:24:18 +00:00
parent 6cc513f13c
commit fb14301967
3 changed files with 26 additions and 3 deletions
+12 -1
View File
@@ -29,7 +29,18 @@ class Sequence {
return acc
}
reduce(f) { this[1..-1].reduce(this[0], f) }
reduce(f) {
var iter = iterate(null)
if (!iter) Fiber.abort("Can't reduce an empty sequence.")
// Seed with the first element.
var result = iteratorValue(iter)
while (iter = iterate(iter)) {
result = f.call(result, iteratorValue(iter))
}
return result
}
}