Skip to content

Commit

Permalink
reuse .map in .indexed
Browse files Browse the repository at this point in the history
  • Loading branch information
zloirock committed Dec 10, 2022
1 parent 7dea5bf commit 4a50a27
Show file tree
Hide file tree
Showing 6 changed files with 90 additions and 104 deletions.
27 changes: 5 additions & 22 deletions 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);
};
54 changes: 54 additions & 0 deletions 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)
});
};
16 changes: 5 additions & 11 deletions 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);
};
21 changes: 21 additions & 0 deletions 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)
});
};
55 changes: 3 additions & 52 deletions 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
});

21 changes: 2 additions & 19 deletions 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
});

0 comments on commit 4a50a27

Please sign in to comment.