Stage 1 Draft / January 23, 2024
Iterator Sequencing
1 Iterator.from ( ...items )
- If the number of elements in items is 1, then
- Let iter be the first element of items.
- Let iteratorRecord be ? GetIteratorFlattenable(iter, iterate-strings).
- Let hasInstance be ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]).
- If hasInstance is true, then
- Return iteratorRecord.[[Iterator]].
- Let wrapper be OrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »).
- Set wrapper.[[Iterated]] to iteratorRecord.
- Return wrapper.
- Let closure be a new Abstract Closure with no parameters that captures items and performs the following steps when called:
- Repeat, while items is not empty,
- Let iter be the first element of items.
- Remove the first element from items.
- Let iteratorRecord be ? GetIteratorFlattenable(iter, iterate-strings).
- Let innerAlive be true.
- Repeat, while innerAlive is true,
- Let innerNext be ? IteratorStep(iteratorRecord).
- If innerNext is false, then
- Set innerAlive to false.
- Else,
- Let innerValue be ? IteratorValue(innerNext).
- Let completion be Completion(Yield(innerValue)).
- If completion is an abrupt completion, then
- Return ? IteratorClose(iteratorRecord, completion).
- Return CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « »).
2 Iterator.prototype.flat ( )
This method performs the following steps when called:
- Let O be the this value.
- If O is not an Object, throw a TypeError exception.
- Let iterated be ? GetIteratorDirect(O).
- Let closure be a new Abstract Closure with no parameters that captures iterated and performs the following steps when called:
- Repeat,
- Let next be ? IteratorStep(iterated).
- If next is false, return undefined.
- Let value be ? IteratorValue(next).
- Let innerIterator be Completion(GetIteratorFlattenable(value, reject-strings)).
- IfAbruptCloseIterator(innerIterator, iterated).
- Let innerAlive be true.
- Repeat, while innerAlive is true,
- Let innerNext be Completion(IteratorStep(innerIterator)).
- IfAbruptCloseIterator(innerNext, iterated).
- If innerNext is false, then
- Set innerAlive to false.
- Else,
- Let innerValue be Completion(IteratorValue(innerNext)).
- IfAbruptCloseIterator(innerValue, iterated).
- Let completion be Completion(Yield(innerValue)).
- If completion is an abrupt completion, then
- Let backupCompletion be Completion(IteratorClose(innerIterator, completion)).
- IfAbruptCloseIterator(backupCompletion, iterated).
- Return ? IteratorClose(completion, iterated).
- Let result be CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »).
- Set result.[[UnderlyingIterator]] to iterated.
- Return result.