IteratorCloseAll.js 1.1 KB

12345678910111213141516171819202122232425262728293031323334
  1. 'use strict';
  2. var $TypeError = require('es-errors/type');
  3. var CompletionRecord = require('es-abstract/2024/CompletionRecord');
  4. var IteratorClose = require('es-abstract/2024/IteratorClose');
  5. var ThrowCompletion = require('es-abstract/2024/ThrowCompletion');
  6. var IsArray = require('es-abstract/helpers/IsArray');
  7. var every = require('es-abstract/helpers/every');
  8. var isIteratorRecord = require('es-abstract/helpers/records/iterator-record');
  9. // https://tc39.es/proposal-joint-iteration/#sec-closeall
  10. module.exports = function IteratorCloseAll(iters, completion) {
  11. if (!IsArray(iters) || !every(iters, isIteratorRecord)) {
  12. throw new $TypeError('Assertion failed: `iters` must be a List of IteratorRecords');
  13. }
  14. if (!(completion instanceof CompletionRecord)) {
  15. throw new $TypeError('Assertion failed: `completion` must be a Completion Record');
  16. }
  17. for (var i = iters.length - 1; i >= 0; i -= 1) { // step 1
  18. try {
  19. IteratorClose(iters[i], completion); // step 1.a
  20. } catch (e) {
  21. // eslint-disable-next-line no-param-reassign
  22. completion = ThrowCompletion(e); // step 1.a
  23. }
  24. }
  25. return completion['?'](); // step 2
  26. };