From 4a50a274d1b9c3ee03177d34ca840c0d6e9c46f4 Mon Sep 17 00:00:00 2001 From: Denis Pushkarev Date: Sun, 11 Dec 2022 01:52:12 +0700 Subject: [PATCH] reuse `.map` in `.indexed` --- .../internals/async-iterator-indexed.js | 27 ++------- .../core-js/internals/async-iterator-map.js | 54 ++++++++++++++++++ .../core-js/internals/iterator-indexed.js | 16 ++---- packages/core-js/internals/iterator-map.js | 21 +++++++ .../modules/esnext.async-iterator.map.js | 55 +------------------ .../core-js/modules/esnext.iterator.map.js | 21 +------ 6 files changed, 90 insertions(+), 104 deletions(-) create mode 100644 packages/core-js/internals/async-iterator-map.js create mode 100644 packages/core-js/internals/iterator-map.js diff --git a/packages/core-js/internals/async-iterator-indexed.js b/packages/core-js/internals/async-iterator-indexed.js index 9f4d2e1e3498..d1a18f526aea 100644 --- a/packages/core-js/internals/async-iterator-indexed.js +++ b/packages/core-js/internals/async-iterator-indexed.js @@ -1,29 +1,12 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); -var getIteratorDirect = require('../internals/get-iterator-direct'); -var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var createIterResultObject = require('../internals/create-iter-result-object'); +var map = require('../internals/async-iterator-map'); -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { - var state = this; - var iterator = state.iterator; - - return Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { - if (anObject(step).done) { - state.done = true; - return createIterResultObject(undefined, true); - } - return createIterResultObject([state.index++, step.value], false); - }).then(null, function (error) { - state.done = true; - throw error; - }); -}); +var callback = function (value, counter) { + return [counter, value]; +}; module.exports = function indexed() { - return new AsyncIteratorProxy(getIteratorDirect(this), { - index: 0 - }); + return call(map, this, callback); }; diff --git a/packages/core-js/internals/async-iterator-map.js b/packages/core-js/internals/async-iterator-map.js new file mode 100644 index 000000000000..7e89ee435904 --- /dev/null +++ b/packages/core-js/internals/async-iterator-map.js @@ -0,0 +1,54 @@ +'use strict'; +// https://github.com/tc39/proposal-iterator-helpers +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 getIteratorDirect = require('../internals/get-iterator-direct'); +var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); +var createIterResultObject = require('../internals/create-iter-result-object'); +var closeAsyncIteration = require('../internals/async-iterator-close'); + +var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { + var state = this; + var iterator = state.iterator; + var mapper = state.mapper; + + return new Promise(function (resolve, reject) { + var doneAndReject = function (error) { + state.done = true; + reject(error); + }; + + var ifAbruptCloseAsyncIterator = function (error) { + closeAsyncIteration(iterator, doneAndReject, error, doneAndReject); + }; + + Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { + try { + if (anObject(step).done) { + state.done = true; + resolve(createIterResultObject(undefined, true)); + } else { + var value = step.value; + try { + var result = mapper(value, state.counter++); + + var handler = function (mapped) { + resolve(createIterResultObject(mapped, false)); + }; + + if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); + else handler(result); + } catch (error2) { ifAbruptCloseAsyncIterator(error2); } + } + } catch (error) { doneAndReject(error); } + }, doneAndReject); + }); +}); + +module.exports = function map(mapper) { + return new AsyncIteratorProxy(getIteratorDirect(this), { + mapper: aCallable(mapper) + }); +}; diff --git a/packages/core-js/internals/iterator-indexed.js b/packages/core-js/internals/iterator-indexed.js index 1a64ec7c486c..b127b9453dfb 100644 --- a/packages/core-js/internals/iterator-indexed.js +++ b/packages/core-js/internals/iterator-indexed.js @@ -1,18 +1,12 @@ 'use strict'; // https://github.com/tc39/proposal-iterator-helpers var call = require('../internals/function-call'); -var anObject = require('../internals/an-object'); -var getIteratorDirect = require('../internals/get-iterator-direct'); -var createIteratorProxy = require('../internals/iterator-create-proxy'); +var map = require('../internals/iterator-map'); -var IteratorProxy = createIteratorProxy(function () { - var result = anObject(call(this.next, this.iterator)); - var done = this.done = !!result.done; - if (!done) return [this.index++, result.value]; -}); +var callback = function (value, counter) { + return [counter, value]; +}; module.exports = function indexed() { - return new IteratorProxy(getIteratorDirect(this), { - index: 0 - }); + return call(map, this, callback); }; diff --git a/packages/core-js/internals/iterator-map.js b/packages/core-js/internals/iterator-map.js new file mode 100644 index 000000000000..42ca191f5812 --- /dev/null +++ b/packages/core-js/internals/iterator-map.js @@ -0,0 +1,21 @@ +'use strict'; +// https://github.com/tc39/proposal-iterator-helpers +var call = require('../internals/function-call'); +var aCallable = require('../internals/a-callable'); +var anObject = require('../internals/an-object'); +var getIteratorDirect = require('../internals/get-iterator-direct'); +var createIteratorProxy = require('../internals/iterator-create-proxy'); +var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); + +var IteratorProxy = createIteratorProxy(function () { + var iterator = this.iterator; + var result = anObject(call(this.next, iterator)); + var done = this.done = !!result.done; + if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); +}); + +module.exports = function map(mapper) { + return new IteratorProxy(getIteratorDirect(this), { + mapper: aCallable(mapper) + }); +}; diff --git a/packages/core-js/modules/esnext.async-iterator.map.js b/packages/core-js/modules/esnext.async-iterator.map.js index 2ef8de1f3ea1..9e3955060796 100644 --- a/packages/core-js/modules/esnext.async-iterator.map.js +++ b/packages/core-js/modules/esnext.async-iterator.map.js @@ -1,57 +1,8 @@ -'use strict'; // https://github.com/tc39/proposal-iterator-helpers 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 getIteratorDirect = require('../internals/get-iterator-direct'); -var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy'); -var createIterResultObject = require('../internals/create-iter-result-object'); -var closeAsyncIteration = require('../internals/async-iterator-close'); - -var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) { - var state = this; - var iterator = state.iterator; - var mapper = state.mapper; - - return new Promise(function (resolve, reject) { - var doneAndReject = function (error) { - state.done = true; - reject(error); - }; - - var ifAbruptCloseAsyncIterator = function (error) { - closeAsyncIteration(iterator, doneAndReject, error, doneAndReject); - }; - - Promise.resolve(anObject(call(state.next, iterator))).then(function (step) { - try { - if (anObject(step).done) { - state.done = true; - resolve(createIterResultObject(undefined, true)); - } else { - var value = step.value; - try { - var result = mapper(value, state.counter++); - - var handler = function (mapped) { - resolve(createIterResultObject(mapped, false)); - }; - - if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator); - else handler(result); - } catch (error2) { ifAbruptCloseAsyncIterator(error2); } - } - } catch (error) { doneAndReject(error); } - }, doneAndReject); - }); -}); +var map = require('../internals/async-iterator-map'); $({ target: 'AsyncIterator', proto: true, real: true }, { - map: function map(mapper) { - return new AsyncIteratorProxy(getIteratorDirect(this), { - mapper: aCallable(mapper) - }); - } + map: map }); + diff --git a/packages/core-js/modules/esnext.iterator.map.js b/packages/core-js/modules/esnext.iterator.map.js index dabe75648d92..4194fd73faa7 100644 --- a/packages/core-js/modules/esnext.iterator.map.js +++ b/packages/core-js/modules/esnext.iterator.map.js @@ -1,24 +1,7 @@ -'use strict'; // https://github.com/tc39/proposal-iterator-helpers var $ = require('../internals/export'); -var call = require('../internals/function-call'); -var aCallable = require('../internals/a-callable'); -var anObject = require('../internals/an-object'); -var getIteratorDirect = require('../internals/get-iterator-direct'); -var createIteratorProxy = require('../internals/iterator-create-proxy'); -var callWithSafeIterationClosing = require('../internals/call-with-safe-iteration-closing'); - -var IteratorProxy = createIteratorProxy(function () { - var iterator = this.iterator; - var result = anObject(call(this.next, iterator)); - var done = this.done = !!result.done; - if (!done) return callWithSafeIterationClosing(iterator, this.mapper, [result.value, this.counter++], true); -}); +var map = require('../internals/iterator-map'); $({ target: 'Iterator', proto: true, real: true }, { - map: function map(mapper) { - return new IteratorProxy(getIteratorDirect(this), { - mapper: aCallable(mapper) - }); - } + map: map });