f7c3cc41f895b4625b415ff48d0bc31aab2b47ce74cb750c5117f171d593e5d21355411572d6c02fff9c24b56745406dd7f78239c9c4bfe6416c3062c06354 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. 'use strict';
  2. var $ = require('../internals/export');
  3. var call = require('../internals/function-call');
  4. var aCallable = require('../internals/a-callable');
  5. var anObject = require('../internals/an-object');
  6. var isObject = require('../internals/is-object');
  7. var getIteratorDirect = require('../internals/get-iterator-direct');
  8. var createAsyncIteratorProxy = require('../internals/async-iterator-create-proxy');
  9. var createIterResultObject = require('../internals/create-iter-result-object');
  10. var closeAsyncIteration = require('../internals/async-iterator-close');
  11. var IS_PURE = require('../internals/is-pure');
  12. var AsyncIteratorProxy = createAsyncIteratorProxy(function (Promise) {
  13. var state = this;
  14. var iterator = state.iterator;
  15. var predicate = state.predicate;
  16. return new Promise(function (resolve, reject) {
  17. var doneAndReject = function (error) {
  18. state.done = true;
  19. reject(error);
  20. };
  21. var ifAbruptCloseAsyncIterator = function (error) {
  22. closeAsyncIteration(iterator, doneAndReject, error, doneAndReject);
  23. };
  24. var loop = function () {
  25. try {
  26. Promise.resolve(anObject(call(state.next, iterator))).then(function (step) {
  27. try {
  28. if (anObject(step).done) {
  29. state.done = true;
  30. resolve(createIterResultObject(undefined, true));
  31. } else {
  32. var value = step.value;
  33. try {
  34. var result = predicate(value, state.counter++);
  35. var handler = function (selected) {
  36. selected ? resolve(createIterResultObject(value, false)) : loop();
  37. };
  38. if (isObject(result)) Promise.resolve(result).then(handler, ifAbruptCloseAsyncIterator);
  39. else handler(result);
  40. } catch (error3) { ifAbruptCloseAsyncIterator(error3); }
  41. }
  42. } catch (error2) { doneAndReject(error2); }
  43. }, doneAndReject);
  44. } catch (error) { doneAndReject(error); }
  45. };
  46. loop();
  47. });
  48. });
  49. // `AsyncIterator.prototype.filter` method
  50. // https://github.com/tc39/proposal-async-iterator-helpers
  51. $({ target: 'AsyncIterator', proto: true, real: true, forced: IS_PURE }, {
  52. filter: function filter(predicate) {
  53. anObject(this);
  54. aCallable(predicate);
  55. return new AsyncIteratorProxy(getIteratorDirect(this), {
  56. predicate: predicate
  57. });
  58. }
  59. });