针灸质控中心平台
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

112 lines
3.6 KiB

'use strict';
var $TypeError = require('es-errors/type');
var AdvanceStringIndex = require('es-abstract/2024/AdvanceStringIndex');
var Call = require('es-abstract/2024/Call');
var CompletionRecord = require('es-abstract/2024/CompletionRecord');
var CreateIteratorFromClosure = require('../aos/CreateIteratorFromClosure');
var GetIteratorDirect = require('../aos/GetIteratorDirect');
var GetMethod = require('es-abstract/2024/GetMethod');
var IsArray = require('es-abstract/2024/IsArray');
var IteratorClose = require('es-abstract/2024/IteratorClose');
var IteratorStepValue = require('es-abstract/2024/IteratorStepValue');
var ThrowCompletion = require('es-abstract/2024/ThrowCompletion');
var Type = require('es-abstract/2024/Type');
var forEach = require('es-abstract/helpers/forEach');
var getIteratorMethod = require('es-abstract/helpers/getIteratorMethod');
var iterHelperProto = require('../IteratorHelperPrototype');
var SLOT = require('internal-slot');
module.exports = function concat() {
if (this instanceof concat) {
throw new $TypeError('`Iterator.concat` is not a constructor');
}
var iterables = []; // step 1
forEach(arguments, function (item) { // step 2
if (Type(item) !== 'Object') {
throw new $TypeError('`Iterator.concat` requires all arguments to be objects'); // step 2.1
}
// var method = GetMethod(item, Symbol.iterator); // step 2.2
var method = getIteratorMethod(
{
AdvanceStringIndex: AdvanceStringIndex,
GetMethod: GetMethod,
IsArray: IsArray
},
item
);
if (typeof method === 'undefined') {
throw new $TypeError('`Iterator.concat` requires all arguments to be iterable'); // step 2.3
}
iterables[iterables.length] = { '[[OpenMethod]]': method, '[[Iterable]]': item }; // step 2.4
});
var sentinel = {};
var innerIterator = sentinel;
var closeIfAbrupt = function (abruptCompletion) {
if (!(abruptCompletion instanceof CompletionRecord)) {
throw new $TypeError('`abruptCompletion` must be a Completion Record');
}
if (innerIterator !== sentinel) {
IteratorClose(
innerIterator,
abruptCompletion
);
}
};
var index = 0;
var closure = function () { // step 3
if (index < iterables.length) {
// forEach(iterables, function (iterable) { // step 3.a
var iteratorRecord;
if (innerIterator === sentinel) {
var iterable = iterables[index];
var iter = Call(iterable['[[OpenMethod]]'], iterable['[[Iterable]]']); // step 3.a.i
if (Type(iter) !== 'Object') {
closeIfAbrupt(ThrowCompletion(new $TypeError('???'))); // step 3.a.ii
}
iteratorRecord = GetIteratorDirect(iter); // step 3.a.iii
innerIterator = iteratorRecord;
} else {
iteratorRecord = innerIterator;
}
// var innerAlive = true; // step 3.a.iv
// while (innerAlive) { // step 3.a.v
if (innerIterator !== sentinel) {
// step 3.a.v.3.a
var innerValue;
try {
innerValue = IteratorStepValue(iteratorRecord); // step 5.b.ix.4.a
} catch (e) {
// innerAlive = false;
innerIterator = sentinel;
index += 1;
closeIfAbrupt(ThrowCompletion(e)); // step 3.a.v.3.b
}
if (iteratorRecord['[[Done]]']) {
// innerAlive = false;
innerIterator = sentinel;
index += 1;
return closure();
}
return innerValue; // // step 3.a.v.3.a
}
// });
}
// return ReturnCompletion(undefined); // step 3.b
return sentinel;
};
SLOT.set(closure, '[[Sentinel]]', sentinel); // for the userland implementation
SLOT.set(closure, '[[CloseIfAbrupt]]', closeIfAbrupt); // for the userland implementation
return CreateIteratorFromClosure(closure, 'Iterator Helper', iterHelperProto, []); // step 4
};