esnext.async-iterator.flat-map.js 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. 'use strict';
  2. // https://github.com/tc39/proposal-iterator-helpers
  3. var $ = require('../internals/export');
  4. var call = require('../internals/function-call');
  5. var aCallable = require('../internals/a-callable');
  6. var anObject = require('../internals/an-object');
  7. var getIteratorDirect = require('../internals/get-iterator-direct');
  8. var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
  9. var getAsyncIterator = require('../internals/get-async-iterator');
  10. var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
  11. var state = this;
  12. var mapper = state.mapper;
  13. var innerIterator;
  14. return new Promise(function (resolve, reject) {
  15. var outerLoop = function () {
  16. try {
  17. Promise.resolve(anObject(call(state.next, state.iterator))).then(function (step) {
  18. try {
  19. if (anObject(step).done) {
  20. state.done = true;
  21. resolve({ done: true, value: undefined });
  22. } else {
  23. Promise.resolve(mapper(step.value)).then(function (mapped) {
  24. try {
  25. state.innerIterator = innerIterator = getAsyncIterator(mapped);
  26. state.innerNext = aCallable(innerIterator.next);
  27. return innerLoop();
  28. } catch (error2) { reject(error2); }
  29. }, reject);
  30. }
  31. } catch (error1) { reject(error1); }
  32. }, reject);
  33. } catch (error) { reject(error); }
  34. };
  35. var innerLoop = function () {
  36. if (innerIterator = state.innerIterator) {
  37. try {
  38. Promise.resolve(anObject(call(state.innerNext, innerIterator))).then(function (result) {
  39. try {
  40. if (anObject(result).done) {
  41. state.innerIterator = state.innerNext = null;
  42. outerLoop();
  43. } else resolve({ done: false, value: result.value });
  44. } catch (error1) { reject(error1); }
  45. }, reject);
  46. } catch (error) { reject(error); }
  47. } else outerLoop();
  48. };
  49. innerLoop();
  50. });
  51. });
  52. $({ target: 'AsyncIterator', proto: true, real: true, forced: true }, {
  53. flatMap: function flatMap(mapper) {
  54. return new AsyncIteratorProxy(getIteratorDirect(this), {
  55. mapper: aCallable(mapper),
  56. innerIterator: null,
  57. innerNext: null
  58. });
  59. }
  60. });