source: frontend/node_modules/es-iterator-helpers/Iterator.concat/implementation.js

Last change on this file was 9af201e, checked in by MBK <marija.karapandzova@…>, 12 days ago

Fix frontend appearance

  • Property mode set to 100644
File size: 3.6 KB
Line 
1'use strict';
2
3var $TypeError = require('es-errors/type');
4
5var AdvanceStringIndex = require('es-abstract/2025/AdvanceStringIndex');
6var Call = require('es-abstract/2025/Call');
7var CompletionRecord = require('es-abstract/2025/CompletionRecord');
8var CreateIteratorFromClosure = require('es-abstract/2025/CreateIteratorFromClosure');
9var GetIteratorDirect = require('es-abstract/2025/GetIteratorDirect');
10var GetMethod = require('es-abstract/2025/GetMethod');
11var IsArray = require('es-abstract/2025/IsArray');
12var IteratorCloseAll = require('../aos/IteratorCloseAll');
13var IteratorStepValue = require('es-abstract/2025/IteratorStepValue');
14
15var forEach = require('es-abstract/helpers/forEach');
16var isObject = require('es-abstract/helpers/isObject');
17var getIteratorMethod = require('es-abstract/helpers/getIteratorMethod');
18
19var iterHelperProto = require('../IteratorHelperPrototype');
20
21var SLOT = require('internal-slot');
22
23module.exports = function concat() {
24 if (this instanceof concat) {
25 throw new $TypeError('`Iterator.concat` is not a constructor');
26 }
27
28 var iterables = []; // step 1
29
30 forEach(arguments, function (item) { // step 2
31 if (!isObject(item)) {
32 throw new $TypeError('`Iterator.concat` requires all arguments to be objects'); // step 2.1
33 }
34 // var method = GetMethod(item, Symbol.iterator); // step 2.2
35 var method = getIteratorMethod(
36 {
37 AdvanceStringIndex: AdvanceStringIndex,
38 GetMethod: GetMethod,
39 IsArray: IsArray
40 },
41 item
42 );
43 if (typeof method === 'undefined') {
44 throw new $TypeError('`Iterator.concat` requires all arguments to be iterable'); // step 2.3
45 }
46 iterables[iterables.length] = { '[[OpenMethod]]': method, '[[Iterable]]': item }; // step 2.4
47 });
48
49 var sentinel = {};
50 var iterablesIndex = 0;
51 var iteratorRecord;
52 var innerAlive = false;
53 var openIters = []; // track the current open iterator for return() forwarding
54 var closure = function () { // step 3
55 if (iterablesIndex >= iterables.length) {
56 return sentinel;
57 }
58 var iterable = iterables[iterablesIndex]; // step 3.a
59 if (!innerAlive) {
60 var iter = Call(iterable['[[OpenMethod]]'], iterable['[[Iterable]]']); // step 3.a.i
61 if (!isObject(iter)) {
62 throw new $TypeError('`Iterator.concat` iterator method did not return an object'); // step 3.a.ii
63 }
64 iteratorRecord = GetIteratorDirect(iter); // step 3.a.iii
65 openIters[0] = iteratorRecord; // track the open iterator
66 innerAlive = true; // step 3.a.iv
67 }
68
69 if (innerAlive) { // step 3.a.v
70 var innerValue = IteratorStepValue(iteratorRecord); // step 3.a.v.1
71 if (iteratorRecord['[[Done]]']) { // step 3.a.v.2
72 innerAlive = false; // step 3.a.v.2.a
73 openIters.length = 0; // no open iterator now
74 } else { // step 3.a.v.3
75 // 1. Let completion be Completion(Yield(innerValue)).
76 return innerValue; // step 3.a.v.3.a
77 }
78 }
79
80 iterablesIndex += 1;
81 return closure();
82 };
83
84 var closeIfAbrupt = function (abruptCompletion) {
85 if (!(abruptCompletion instanceof CompletionRecord)) {
86 throw new $TypeError('`abruptCompletion` must be a Completion Record');
87 }
88 iterablesIndex = iterables.length;
89 innerAlive = false;
90 if (openIters.length > 0) {
91 var toClose = openIters.slice();
92 openIters.length = 0; // prevent double-closing
93 IteratorCloseAll(toClose, abruptCompletion);
94 }
95 };
96
97 SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
98 SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
99
100 var gen = CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, ['[[UnderlyingIterators]]']); // step 5
101 SLOT.set(gen, '[[UnderlyingIterators]]', openIters); // step 6 - share the array reference
102 return gen; // step 7
103};
Note: See TracBrowser for help on using the repository browser.