'use strict'; var call = require('../internals/function-call'); var anObject = require('../internals/an-object'); var create = require('../internals/object-create'); var getMethod = require('../internals/get-method'); var defineBuiltIns = require('../internals/define-built-ins'); var InternalStateModule = require('../internals/internal-state'); var getBuiltIn = require('../internals/get-built-in'); var AsyncIteratorPrototype = require('../internals/async-iterator-prototype'); var createIterResultObject = require('../internals/create-iter-result-object'); var Promise = getBuiltIn('Promise'); var ASYNC_FROM_SYNC_ITERATOR = 'AsyncFromSyncIterator'; var setInternalState = InternalStateModule.set; var getInternalState = InternalStateModule.getterFor(ASYNC_FROM_SYNC_ITERATOR); var asyncFromSyncIteratorContinuation = function (result, resolve, reject) { var done = result.done; Promise.resolve(result.value).then(function (value) { resolve(createIterResultObject(value, done)); }, reject); }; var AsyncFromSyncIterator = function AsyncIterator(iteratorRecord) { iteratorRecord.type = ASYNC_FROM_SYNC_ITERATOR; setInternalState(this, iteratorRecord); }; AsyncFromSyncIterator.prototype = defineBuiltIns(create(AsyncIteratorPrototype), { next: function next() { var state = getInternalState(this); return new Promise(function (resolve, reject) { var result = anObject(call(state.next, state.iterator)); asyncFromSyncIteratorContinuation(result, resolve, reject); }); }, 'return': function () { var iterator = getInternalState(this).iterator; return new Promise(function (resolve, reject) { var $return = getMethod(iterator, 'return'); if ($return === undefined) return resolve(createIterResultObject(undefined, true)); var result = anObject(call($return, iterator)); asyncFromSyncIteratorContinuation(result, resolve, reject); }); } }); module.exports = AsyncFromSyncIterator;