Stage 1 Draft / January 23, 2024

Iterator Sequencing

1 Iterator.from ( ...items )

  1. If the number of elements in items is 1, then
    1. Let iter be the first element of items.
    2. Let iteratorRecord be ? GetIteratorFlattenable(iter, iterate-strings).
    3. Let hasInstance be ? OrdinaryHasInstance(%Iterator%, iteratorRecord.[[Iterator]]).
    4. If hasInstance is true, then
      1. Return iteratorRecord.[[Iterator]].
    5. Let wrapper be OrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »).
    6. Set wrapper.[[Iterated]] to iteratorRecord.
    7. Return wrapper.
  2. Let closure be a new Abstract Closure with no parameters that captures items and performs the following steps when called:
    1. Repeat, while items is not empty,
      1. Let iter be the first element of items.
      2. Remove the first element from items.
      3. Let iteratorRecord be ? GetIteratorFlattenable(iter, iterate-strings).
      4. Let innerAlive be true.
      5. Repeat, while innerAlive is true,
        1. Let innerNext be ? IteratorStep(iteratorRecord).
        2. If innerNext is false, then
          1. Set innerAlive to false.
        3. Else,
          1. Let innerValue be ? IteratorValue(innerNext).
          2. Let completion be Completion(Yield(innerValue)).
          3. If completion is an abrupt completion, then
            1. Return ? IteratorClose(iteratorRecord, completion).
  3. Return CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « »).

2 Iterator.prototype.flat ( )

This method performs the following steps when called:

  1. Let O be the this value.
  2. If O is not an Object, throw a TypeError exception.
  3. Let iterated be ? GetIteratorDirect(O).
  4. Let closure be a new Abstract Closure with no parameters that captures iterated and performs the following steps when called:
    1. Repeat,
      1. Let next be ? IteratorStep(iterated).
      2. If next is false, return undefined.
      3. Let value be ? IteratorValue(next).
      4. Let innerIterator be Completion(GetIteratorFlattenable(value, reject-strings)).
      5. IfAbruptCloseIterator(innerIterator, iterated).
      6. Let innerAlive be true.
      7. Repeat, while innerAlive is true,
        1. Let innerNext be Completion(IteratorStep(innerIterator)).
        2. IfAbruptCloseIterator(innerNext, iterated).
        3. If innerNext is false, then
          1. Set innerAlive to false.
        4. Else,
          1. Let innerValue be Completion(IteratorValue(innerNext)).
          2. IfAbruptCloseIterator(innerValue, iterated).
          3. Let completion be Completion(Yield(innerValue)).
          4. If completion is an abrupt completion, then
            1. Let backupCompletion be Completion(IteratorClose(innerIterator, completion)).
            2. IfAbruptCloseIterator(backupCompletion, iterated).
            3. Return ? IteratorClose(completion, iterated).
  5. Let result be CreateIteratorFromClosure(closure, "Iterator Helper", %IteratorHelperPrototype%, « [[UnderlyingIterator]] »).
  6. Set result.[[UnderlyingIterator]] to iterated.
  7. Return result.