'use strict'; var Call = require('es-abstract/2024/Call'); var Get = require('es-abstract/2024/Get'); var HasProperty = require('es-abstract/2024/HasProperty'); var IsCallable = require('es-abstract/2024/IsCallable'); var LengthOfArrayLike = require('es-abstract/2024/LengthOfArrayLike'); var ToObject = require('es-object-atoms/ToObject'); var ToString = require('es-abstract/2024/ToString'); var callBound = require('call-bind/callBound'); var isString = require('is-string'); var $Object = require('es-object-atoms'); var $TypeError = require('es-errors/type'); // Check failure of by-index access of string characters (IE < 9) and failure of `0 in boxedString` (Rhino) var boxedString = $Object('a'); var splitString = boxedString[0] !== 'a' || !(0 in boxedString); var strSplit = callBound('%String.prototype.split%'); module.exports = function reduce(callbackfn) { var O = ToObject(this); var self = splitString && isString(O) ? strSplit(O, '') : O; var len = LengthOfArrayLike(self); // If no callback function or if callback is not a callable function if (!IsCallable(callbackfn)) { throw new $TypeError('Array.prototype.reduce callback must be a function'); } if (len === 0 && arguments.length < 2) { throw new $TypeError('reduce of empty array with no initial value'); } var k = 0; var accumulator; var Pk, kPresent; if (arguments.length > 1) { accumulator = arguments[1]; } else { kPresent = false; while (!kPresent && k < len) { Pk = ToString(k); kPresent = HasProperty(O, Pk); if (kPresent) { accumulator = Get(O, Pk); } k += 1; } if (!kPresent) { throw new $TypeError('reduce of empty array with no initial value'); } } while (k < len) { Pk = ToString(k); kPresent = HasProperty(O, Pk); if (kPresent) { var kValue = Get(O, Pk); accumulator = Call(callbackfn, void undefined, [accumulator, kValue, k, O]); } k += 1; } return accumulator; };