| 'use strict'; | 
|   | 
| var Call = require('es-abstract/2022/Call'); | 
| var Get = require('es-abstract/2022/Get'); | 
| var HasProperty = require('es-abstract/2022/HasProperty'); | 
| var IsCallable = require('es-abstract/2022/IsCallable'); | 
| var LengthOfArrayLike = require('es-abstract/2022/LengthOfArrayLike'); | 
| var ToObject = require('es-abstract/2022/ToObject'); | 
| var ToString = require('es-abstract/2022/ToString'); | 
| var callBound = require('call-bind/callBound'); | 
| var isString = require('is-string'); | 
|   | 
| var $TypeError = TypeError; | 
|   | 
| // 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; | 
| }; |