| 'use strict'; |
| var aCallable = require('../internals/a-callable'); |
| var toObject = require('../internals/to-object'); |
| var IndexedObject = require('../internals/indexed-object'); |
| var lengthOfArrayLike = require('../internals/length-of-array-like'); |
|
|
| var $TypeError = TypeError; |
|
|
| var REDUCE_EMPTY = 'Reduce of empty array with no initial value'; |
|
|
| |
| var createMethod = function (IS_RIGHT) { |
| return function (that, callbackfn, argumentsLength, memo) { |
| var O = toObject(that); |
| var self = IndexedObject(O); |
| var length = lengthOfArrayLike(O); |
| aCallable(callbackfn); |
| if (length === 0 && argumentsLength < 2) throw new $TypeError(REDUCE_EMPTY); |
| var index = IS_RIGHT ? length - 1 : 0; |
| var i = IS_RIGHT ? -1 : 1; |
| if (argumentsLength < 2) while (true) { |
| if (index in self) { |
| memo = self[index]; |
| index += i; |
| break; |
| } |
| index += i; |
| if (IS_RIGHT ? index < 0 : length <= index) { |
| throw new $TypeError(REDUCE_EMPTY); |
| } |
| } |
| for (;IS_RIGHT ? index >= 0 : length > index; index += i) if (index in self) { |
| memo = callbackfn(memo, self[index], index, O); |
| } |
| return memo; |
| }; |
| }; |
|
|
| module.exports = { |
| |
| |
| left: createMethod(false), |
| |
| |
| right: createMethod(true) |
| }; |
|
|