| 'use strict'; | 
| var $ = require('../internals/export'); | 
| var call = require('../internals/function-call'); | 
| var aCallable = require('../internals/a-callable'); | 
| var anObject = require('../internals/an-object'); | 
| var isObject = require('../internals/is-object'); | 
| var getBuiltIn = require('../internals/get-built-in'); | 
| var getIteratorDirect = require('../internals/get-iterator-direct'); | 
| var closeAsyncIteration = require('../internals/async-iterator-close'); | 
|   | 
| var Promise = getBuiltIn('Promise'); | 
| var $TypeError = TypeError; | 
|   | 
| // `AsyncIterator.prototype.reduce` method | 
| // https://github.com/tc39/proposal-async-iterator-helpers | 
| $({ target: 'AsyncIterator', proto: true, real: true }, { | 
|   reduce: function reduce(reducer /* , initialValue */) { | 
|     anObject(this); | 
|     aCallable(reducer); | 
|     var record = getIteratorDirect(this); | 
|     var iterator = record.iterator; | 
|     var next = record.next; | 
|     var noInitial = arguments.length < 2; | 
|     var accumulator = noInitial ? undefined : arguments[1]; | 
|     var counter = 0; | 
|   | 
|     return new Promise(function (resolve, reject) { | 
|       var ifAbruptCloseAsyncIterator = function (error) { | 
|         closeAsyncIteration(iterator, reject, error, reject); | 
|       }; | 
|   | 
|       var loop = function () { | 
|         try { | 
|           Promise.resolve(anObject(call(next, iterator))).then(function (step) { | 
|             try { | 
|               if (anObject(step).done) { | 
|                 noInitial ? reject(new $TypeError('Reduce of empty iterator with no initial value')) : resolve(accumulator); | 
|               } else { | 
|                 var value = step.value; | 
|                 if (noInitial) { | 
|                   noInitial = false; | 
|                   accumulator = value; | 
|                   loop(); | 
|                 } else try { | 
|                   var result = reducer(accumulator, value, counter); | 
|   | 
|                   var handler = function ($result) { | 
|                     accumulator = $result; | 
|                     loop(); | 
|                   }; | 
|   | 
|                   if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); | 
|                   else handler(result); | 
|                 } catch (error3) { ifAbruptCloseAsyncIterator(error3); } | 
|               } | 
|               counter++; | 
|             } catch (error2) { reject(error2); } | 
|           }, reject); | 
|         } catch (error) { reject(error); } | 
|       }; | 
|   | 
|       loop(); | 
|     }); | 
|   } | 
| }); |