2 var apply = require('../internals/function-apply');
3 var anObject = require('../internals/an-object');
4 var create = require('../internals/object-create');
5 var getMethod = require('../internals/get-method');
6 var redefineAll = require('../internals/redefine-all');
7 var InternalStateModule = require('../internals/internal-state');
8 var getBuiltIn = require('../internals/get-built-in');
9 var AsyncIteratorPrototype = require('../internals/async-iterator-prototype');
11 var Promise = getBuiltIn('Promise');
13 var setInternalState = InternalStateModule.set;
14 var getInternalState = InternalStateModule.get;
16 var asyncFromSyncIteratorContinuation = function (result, resolve, reject) {
17 var done = result.done;
18 Promise.resolve(result.value).then(function (value) {
19 resolve({ done: done, value: value });
23 var AsyncFromSyncIterator = function AsyncIterator(iterator) {
24 setInternalState(this, {
25 iterator: anObject(iterator),
30 AsyncFromSyncIterator.prototype = redefineAll(create(AsyncIteratorPrototype), {
31 next: function next(arg) {
32 var state = getInternalState(this);
33 var hasArg = !!arguments.length;
34 return new Promise(function (resolve, reject) {
35 var result = anObject(apply(state.next, state.iterator, hasArg ? [arg] : []));
36 asyncFromSyncIteratorContinuation(result, resolve, reject);
39 'return': function (arg) {
40 var iterator = getInternalState(this).iterator;
41 var hasArg = !!arguments.length;
42 return new Promise(function (resolve, reject) {
43 var $return = getMethod(iterator, 'return');
44 if ($return === undefined) return resolve({ done: true, value: arg });
45 var result = anObject(apply($return, iterator, hasArg ? [arg] : []));
46 asyncFromSyncIteratorContinuation(result, resolve, reject);
49 'throw': function (arg) {
50 var iterator = getInternalState(this).iterator;
51 var hasArg = !!arguments.length;
52 return new Promise(function (resolve, reject) {
53 var $throw = getMethod(iterator, 'throw');
54 if ($throw === undefined) return reject(arg);
55 var result = anObject(apply($throw, iterator, hasArg ? [arg] : []));
56 asyncFromSyncIteratorContinuation(result, resolve, reject);
61 module.exports = AsyncFromSyncIterator;