123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
- import { $$asyncIterator, getAsyncIterator } from 'iterall';
- /**
- * Given an AsyncIterable and a callback function, return an AsyncIterator
- * which produces values mapped via calling the callback function.
- */
- export default function mapAsyncIterator(iterable, callback, rejectCallback) {
- var iterator = getAsyncIterator(iterable);
- var $return;
- var abruptClose; // $FlowFixMe(>=0.68.0)
- if (typeof iterator.return === 'function') {
- $return = iterator.return;
- abruptClose = function abruptClose(error) {
- var rethrow = function rethrow() {
- return Promise.reject(error);
- };
- return $return.call(iterator).then(rethrow, rethrow);
- };
- }
- function mapResult(result) {
- return result.done ? result : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
- }
- var mapReject;
- if (rejectCallback) {
- // Capture rejectCallback to ensure it cannot be null.
- var reject = rejectCallback;
- mapReject = function mapReject(error) {
- return asyncMapValue(error, reject).then(iteratorResult, abruptClose);
- };
- }
- /* TODO: Flow doesn't support symbols as keys:
- https://github.com/facebook/flow/issues/3258 */
- return _defineProperty({
- next: function next() {
- return iterator.next().then(mapResult, mapReject);
- },
- return: function _return() {
- return $return ? $return.call(iterator).then(mapResult, mapReject) : Promise.resolve({
- value: undefined,
- done: true
- });
- },
- throw: function _throw(error) {
- // $FlowFixMe(>=0.68.0)
- if (typeof iterator.throw === 'function') {
- return iterator.throw(error).then(mapResult, mapReject);
- }
- return Promise.reject(error).catch(abruptClose);
- }
- }, $$asyncIterator, function () {
- return this;
- });
- }
- function asyncMapValue(value, callback) {
- return new Promise(function (resolve) {
- return resolve(callback(value));
- });
- }
- function iteratorResult(value) {
- return {
- value: value,
- done: false
- };
- }
|