Skip to content

Commit

Permalink
align handling of optional .next arguments in (Async)Iterator met…
Browse files Browse the repository at this point in the history
…hods with the current spec draft

mainly - ignoring of the first passed to `.next` arguments in built-in generators
  • Loading branch information
zloirock committed Aug 28, 2021
1 parent 0f1bc28 commit 8df6d0e
Show file tree
Hide file tree
Showing 17 changed files with 38 additions and 32 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
## Changelog
##### Unreleased
- `AsyncFromSyncIterator` made stricter, related mainly to `AsyncIterator.from` and `AsyncIterator.prototype.flatMap`
- Handling of optional `.next` arguments in `(Async)Iterator` methods is aligned with the current spec draft (mainly - ignoring of the first passed to `.next` arguments in built-in generators)

##### 3.16.3 - 2021.08.25
- Fixed `CreateAsyncFromSyncIterator` semantic in `AsyncIterator.from`, related to [#765](https://github.com/zloirock/core-js/issues/765)
Expand Down
6 changes: 4 additions & 2 deletions packages/core-js/internals/async-iterator-create-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,16 +36,18 @@ module.exports = function (nextHandler, IS_ITERATOR) {
var AsyncIteratorProxy = function AsyncIterator(state) {
state.next = aFunction(state.iterator.next);
state.done = false;
state.ignoreArg = !IS_ITERATOR;
setInternalState(this, state);
};

AsyncIteratorProxy.prototype = redefineAll(create(path.AsyncIterator.prototype), {
next: function next(arg) {
var state = getInternalState(this);
var hasArg = !!arguments.length;
var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined];
state.ignoreArg = false;
if (state.done) return Promise.resolve({ done: true, value: undefined });
try {
return Promise.resolve(anObject(nextHandler.call(state, Promise, hasArg ? arg : undefined, hasArg)));
return Promise.resolve(anObject(nextHandler.call(state, Promise, args)));
} catch (error) {
return Promise.reject(error);
}
Expand Down
7 changes: 5 additions & 2 deletions packages/core-js/internals/iterator-create-proxy.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,13 +30,16 @@ module.exports = function (nextHandler, IS_ITERATOR) {
var IteratorProxy = function Iterator(state) {
state.next = aFunction(state.iterator.next);
state.done = false;
state.ignoreArg = !IS_ITERATOR;
setInternalState(this, state);
};

IteratorProxy.prototype = redefineAll(create(path.Iterator.prototype), {
next: function next() {
next: function next(arg) {
var state = getInternalState(this);
var result = state.done ? undefined : nextHandler.apply(state, arguments);
var args = arguments.length ? [state.ignoreArg ? undefined : arg] : IS_ITERATOR ? [] : [undefined];
state.ignoreArg = false;
var result = state.done ? undefined : nextHandler.call(state, args);
return { done: state.done, value: result };
},
'return': $return,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,11 @@ var $ = require('../internals/export');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
var state = this;
var iterator = state.iterator;

return Promise.resolve(anObject(state.next.call(iterator, arg))).then(function (step) {
return Promise.resolve(anObject(state.next.apply(iterator, args))).then(function (step) {
if (anObject(step).done) {
state.done = true;
return { done: true, value: undefined };
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.drop.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ var anObject = require('../internals/an-object');
var toPositiveInteger = require('../internals/to-positive-integer');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
var state = this;

return new Promise(function (resolve, reject) {
var loop = function () {
try {
Promise.resolve(
anObject(state.next.call(state.iterator, state.remaining ? undefined : arg))
anObject(state.next.apply(state.iterator, state.remaining ? [] : args))
).then(function (step) {
try {
if (anObject(step).done) {
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,14 @@ var aFunction = require('../internals/a-function');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
var state = this;
var filterer = state.filterer;

return new Promise(function (resolve, reject) {
var loop = function () {
try {
Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
Promise.resolve(anObject(state.next.apply(state.iterator, args))).then(function (step) {
try {
if (anObject(step).done) {
state.done = true;
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.flat-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,15 +6,15 @@ var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
var getAsyncIterator = require('../internals/get-async-iterator');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
var state = this;
var mapper = state.mapper;
var innerIterator;

return new Promise(function (resolve, reject) {
var outerLoop = function () {
try {
Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
Promise.resolve(anObject(state.next.call(state.iterator))).then(function (step) {
try {
if (anObject(step).done) {
state.done = true;
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.from.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ var ASYNC_ITERATOR = wellKnownSymbol('asyncIterator');

var AsyncIterator = path.AsyncIterator;

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg, hasArg) {
return anObject(this.next.apply(this.iterator, hasArg ? [arg] : []));
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
return anObject(this.next.apply(this.iterator, args));
}, true);

$({ target: 'AsyncIterator', stat: true }, {
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.map.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,11 @@ var aFunction = require('../internals/a-function');
var anObject = require('../internals/an-object');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
var state = this;
var mapper = state.mapper;

return Promise.resolve(anObject(state.next.call(state.iterator, arg))).then(function (step) {
return Promise.resolve(anObject(state.next.apply(state.iterator, args))).then(function (step) {
if (anObject(step).done) {
state.done = true;
return { done: true, value: undefined };
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.async-iterator.take.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object');
var toPositiveInteger = require('../internals/to-positive-integer');
var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');

var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, args) {
var iterator = this.iterator;
var returnMethod, result;
if (!this.remaining--) {
Expand All @@ -18,7 +18,7 @@ var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise, arg) {
});
}
return result;
} return this.next.call(iterator, arg);
} return this.next.apply(iterator, args);
});

$({ target: 'AsyncIterator', proto: true, real: true }, {
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.as-indexed-pairs.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ var $ = require('../internals/export');
var anObject = require('../internals/an-object');
var createIteratorProxy = require('../internals/iterator-create-proxy');

var IteratorProxy = createIteratorProxy(function (arg) {
var result = anObject(this.next.call(this.iterator, arg));
var IteratorProxy = createIteratorProxy(function (args) {
var result = anObject(this.next.apply(this.iterator, args));
var done = this.done = !!result.done;
if (!done) return [this.index++, result.value];
});
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.drop.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ var anObject = require('../internals/an-object');
var toPositiveInteger = require('../internals/to-positive-integer');
var createIteratorProxy = require('../internals/iterator-create-proxy');

var IteratorProxy = createIteratorProxy(function (arg) {
var IteratorProxy = createIteratorProxy(function (args) {
var iterator = this.iterator;
var next = this.next;
var result, done;
Expand All @@ -15,7 +15,7 @@ var IteratorProxy = createIteratorProxy(function (arg) {
done = this.done = !!result.done;
if (done) return;
}
result = anObject(next.call(iterator, arg));
result = anObject(next.apply(iterator, args));
done = this.done = !!result.done;
if (!done) return result.value;
});
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.filter.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ var anObject = require('../internals/an-object');
var createIteratorProxy = require('../internals/iterator-create-proxy');
var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');

var IteratorProxy = createIteratorProxy(function (arg) {
var IteratorProxy = createIteratorProxy(function (args) {
var iterator = this.iterator;
var filterer = this.filterer;
var next = this.next;
var result, done, value;
while (true) {
result = anObject(next.call(iterator, arg));
result = anObject(next.apply(iterator, args));
done = this.done = !!result.done;
if (done) return;
value = result.value;
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.flat-map.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ var getIteratorMethod = require('../internals/get-iterator-method');
var createIteratorProxy = require('../internals/iterator-create-proxy');
var iteratorClose = require('../internals/iterator-close');

var IteratorProxy = createIteratorProxy(function (arg) {
var IteratorProxy = createIteratorProxy(function () {
var iterator = this.iterator;
var mapper = this.mapper;
var result, mapped, iteratorMethod, innerIterator;
Expand All @@ -20,7 +20,7 @@ var IteratorProxy = createIteratorProxy(function (arg) {
this.innerIterator = this.innerNext = null;
}

result = anObject(this.next.call(iterator, arg));
result = anObject(this.next.call(iterator));

if (this.done = !!result.done) return;

Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.from.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@ var getIteratorMethod = require('../internals/get-iterator-method');

var Iterator = path.Iterator;

var IteratorProxy = createIteratorProxy(function (arg) {
var result = anObject(this.next.call(this.iterator, arg));
var IteratorProxy = createIteratorProxy(function (args) {
var result = anObject(this.next.apply(this.iterator, args));
var done = this.done = !!result.done;
if (!done) return result.value;
}, true);
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.map.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,9 @@ var anObject = require('../internals/an-object');
var createIteratorProxy = require('../internals/iterator-create-proxy');
var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing');

var IteratorProxy = createIteratorProxy(function (arg) {
var IteratorProxy = createIteratorProxy(function (args) {
var iterator = this.iterator;
var result = anObject(this.next.call(iterator, arg));
var result = anObject(this.next.apply(iterator, args));
var done = this.done = !!result.done;
if (!done) return callWithSafeIterationClosing(iterator, this.mapper, result.value);
});
Expand Down
4 changes: 2 additions & 2 deletions packages/core-js/modules/esnext.iterator.take.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ var toPositiveInteger = require('../internals/to-positive-integer');
var createIteratorProxy = require('../internals/iterator-create-proxy');
var iteratorClose = require('../internals/iterator-close');

var IteratorProxy = createIteratorProxy(function (arg) {
var IteratorProxy = createIteratorProxy(function (args) {
var iterator = this.iterator;
if (!this.remaining--) {
this.done = true;
return iteratorClose(iterator);
}
var result = anObject(this.next.call(iterator, arg));
var result = anObject(this.next.apply(iterator, args));
var done = this.done = !!result.done;
if (!done) return result.value;
});
Expand Down

0 comments on commit 8df6d0e

Please sign in to comment.