mapAsyncIterator.js 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. "use strict";
  2. Object.defineProperty(exports, "__esModule", { value: true });
  3. exports.mapAsyncIterator = void 0;
  4. /**
  5. * Given an AsyncIterable and a callback function, return an AsyncIterator
  6. * which produces values mapped via calling the callback function.
  7. */
  8. function mapAsyncIterator(iterator, callback, rejectCallback) {
  9. let $return;
  10. let abruptClose;
  11. if (typeof iterator.return === 'function') {
  12. $return = iterator.return;
  13. abruptClose = (error) => {
  14. const rethrow = () => Promise.reject(error);
  15. return $return.call(iterator).then(rethrow, rethrow);
  16. };
  17. }
  18. function mapResult(result) {
  19. return result.done ? result : asyncMapValue(result.value, callback).then(iteratorResult, abruptClose);
  20. }
  21. let mapReject;
  22. if (rejectCallback) {
  23. // Capture rejectCallback to ensure it cannot be null.
  24. const reject = rejectCallback;
  25. mapReject = (error) => asyncMapValue(error, reject).then(iteratorResult, abruptClose);
  26. }
  27. return {
  28. next() {
  29. return iterator.next().then(mapResult, mapReject);
  30. },
  31. return() {
  32. return $return
  33. ? $return.call(iterator).then(mapResult, mapReject)
  34. : Promise.resolve({ value: undefined, done: true });
  35. },
  36. throw(error) {
  37. if (typeof iterator.throw === 'function') {
  38. return iterator.throw(error).then(mapResult, mapReject);
  39. }
  40. return Promise.reject(error).catch(abruptClose);
  41. },
  42. [Symbol.asyncIterator]() {
  43. return this;
  44. },
  45. };
  46. }
  47. exports.mapAsyncIterator = mapAsyncIterator;
  48. function asyncMapValue(value, callback) {
  49. return new Promise(resolve => resolve(callback(value)));
  50. }
  51. function iteratorResult(value) {
  52. return { value, done: false };
  53. }