'use strict'; 
 | 
var call = require('../internals/function-call'); 
 | 
var perform = require('../internals/perform'); 
 | 
var anObject = require('../internals/an-object'); 
 | 
var create = require('../internals/object-create'); 
 | 
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); 
 | 
var defineBuiltIns = require('../internals/define-built-ins'); 
 | 
var wellKnownSymbol = require('../internals/well-known-symbol'); 
 | 
var InternalStateModule = require('../internals/internal-state'); 
 | 
var getBuiltIn = require('../internals/get-built-in'); 
 | 
var getMethod = require('../internals/get-method'); 
 | 
var AsyncIteratorPrototype = require('../internals/async-iterator-prototype'); 
 | 
var createIterResultObject = require('../internals/create-iter-result-object'); 
 | 
var iteratorClose = require('../internals/iterator-close'); 
 | 
  
 | 
var Promise = getBuiltIn('Promise'); 
 | 
  
 | 
var TO_STRING_TAG = wellKnownSymbol('toStringTag'); 
 | 
var ASYNC_ITERATOR_HELPER = 'AsyncIteratorHelper'; 
 | 
var WRAP_FOR_VALID_ASYNC_ITERATOR = 'WrapForValidAsyncIterator'; 
 | 
var setInternalState = InternalStateModule.set; 
 | 
  
 | 
var createAsyncIteratorProxyPrototype = function (IS_ITERATOR) { 
 | 
  var IS_GENERATOR = !IS_ITERATOR; 
 | 
  var getInternalState = InternalStateModule.getterFor(IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER); 
 | 
  
 | 
  var getStateOrEarlyExit = function (that) { 
 | 
    var stateCompletion = perform(function () { 
 | 
      return getInternalState(that); 
 | 
    }); 
 | 
  
 | 
    var stateError = stateCompletion.error; 
 | 
    var state = stateCompletion.value; 
 | 
  
 | 
    if (stateError || (IS_GENERATOR && state.done)) { 
 | 
      return { exit: true, value: stateError ? Promise.reject(state) : Promise.resolve(createIterResultObject(undefined, true)) }; 
 | 
    } return { exit: false, value: state }; 
 | 
  }; 
 | 
  
 | 
  return defineBuiltIns(create(AsyncIteratorPrototype), { 
 | 
    next: function next() { 
 | 
      var stateCompletion = getStateOrEarlyExit(this); 
 | 
      var state = stateCompletion.value; 
 | 
      if (stateCompletion.exit) return state; 
 | 
      var handlerCompletion = perform(function () { 
 | 
        return anObject(state.nextHandler(Promise)); 
 | 
      }); 
 | 
      var handlerError = handlerCompletion.error; 
 | 
      var value = handlerCompletion.value; 
 | 
      if (handlerError) state.done = true; 
 | 
      return handlerError ? Promise.reject(value) : Promise.resolve(value); 
 | 
    }, 
 | 
    'return': function () { 
 | 
      var stateCompletion = getStateOrEarlyExit(this); 
 | 
      var state = stateCompletion.value; 
 | 
      if (stateCompletion.exit) return state; 
 | 
      state.done = true; 
 | 
      var iterator = state.iterator; 
 | 
      var returnMethod, result; 
 | 
      var completion = perform(function () { 
 | 
        if (state.inner) try { 
 | 
          iteratorClose(state.inner.iterator, 'normal'); 
 | 
        } catch (error) { 
 | 
          return iteratorClose(iterator, 'throw', error); 
 | 
        } 
 | 
        return getMethod(iterator, 'return'); 
 | 
      }); 
 | 
      returnMethod = result = completion.value; 
 | 
      if (completion.error) return Promise.reject(result); 
 | 
      if (returnMethod === undefined) return Promise.resolve(createIterResultObject(undefined, true)); 
 | 
      completion = perform(function () { 
 | 
        return call(returnMethod, iterator); 
 | 
      }); 
 | 
      result = completion.value; 
 | 
      if (completion.error) return Promise.reject(result); 
 | 
      return IS_ITERATOR ? Promise.resolve(result) : Promise.resolve(result).then(function (resolved) { 
 | 
        anObject(resolved); 
 | 
        return createIterResultObject(undefined, true); 
 | 
      }); 
 | 
    } 
 | 
  }); 
 | 
}; 
 | 
  
 | 
var WrapForValidAsyncIteratorPrototype = createAsyncIteratorProxyPrototype(true); 
 | 
var AsyncIteratorHelperPrototype = createAsyncIteratorProxyPrototype(false); 
 | 
  
 | 
createNonEnumerableProperty(AsyncIteratorHelperPrototype, TO_STRING_TAG, 'Async Iterator Helper'); 
 | 
  
 | 
module.exports = function (nextHandler, IS_ITERATOR) { 
 | 
  var AsyncIteratorProxy = function AsyncIterator(record, state) { 
 | 
    if (state) { 
 | 
      state.iterator = record.iterator; 
 | 
      state.next = record.next; 
 | 
    } else state = record; 
 | 
    state.type = IS_ITERATOR ? WRAP_FOR_VALID_ASYNC_ITERATOR : ASYNC_ITERATOR_HELPER; 
 | 
    state.nextHandler = nextHandler; 
 | 
    state.counter = 0; 
 | 
    state.done = false; 
 | 
    setInternalState(this, state); 
 | 
  }; 
 | 
  
 | 
  AsyncIteratorProxy.prototype = IS_ITERATOR ? WrapForValidAsyncIteratorPrototype : AsyncIteratorHelperPrototype; 
 | 
  
 | 
  return AsyncIteratorProxy; 
 | 
}; 
 |