diff --git a/spec.html b/spec.html index 5a9864c..78978a5 100644 --- a/spec.html +++ b/spec.html @@ -248,6 +248,39 @@

1. Return _iteratorRecord_. + + +

+ GetIteratorFlattenable ( + _obj_: an ECMAScript language value, + _hint_: ~sync~ or ~async~, + ): either a normal completion containing an Iterator Record or a throw completion +

+
+
+ + 1. If _obj_ is not an Object, throw a *TypeError* exception. + 1. Let _alreadyAsync_ be *false*. + 1. Let _method_ be *undefined*. + 1. If _hint_ is ~async~, then + 1. Set _method_ to ? Get(_obj_, @@asyncIterator). + 1. Set _alreadyAsync_ to *true*. + 1. If IsCallable(_method_) is *false*, then + 1. Set _method_ to ? Get(_obj_, @@iterator). + 1. Set _alreadyAsync_ to *false*. + 1. If IsCallable(_method_) is *false*, then + 1. Let _iterator_ be _obj_. + 1. Set _alreadyAsync_ to *true*. + 1. Else, + 1. Let _iterator_ be ? Call(_method_, _obj_). + 1. Let _nextMethod_ be ? GetV(_iterator_, *"next"*). + 1. If IsCallable(_nextMethod_) is *false*, throw a *TypeError* exception. + 1. Let _iteratorRecord_ be the Iterator Record { [[Iterator]]: _iterator_, [[NextMethod]]: _nextMethod_, [[Done]]: *false* }. + 1. If _hint_ is ~async~ and _alreadyAsync_ is *false*, then + 1. Return CreateAsyncFromSyncIterator(_iteratorRecord_). + 1. Return _iteratorRecord_. + +
@@ -310,14 +343,10 @@

Iterator.prototype

Iterator.from ( _O_ )

- 1. Let _usingIterator_ be ? GetMethod(_O_, @@iterator). - 1. If _usingIterator_ is not *undefined*, then - 1. Let _iteratorRecord_ be ? GetIterator(_O_, ~sync~, _usingIterator_). - 1. If IsCallable(_iteratorRecord_.[[NextMethod]]) is *false*, throw a *TypeError* exception. - 1. Let _hasInstance_ be ? OrdinaryHasInstance(%Iterator%, _iteratorRecord_.[[Iterator]]). - 1. If _hasInstance_ is *true*, then - 1. Return _iteratorRecord_.[[Iterator]]. - 1. Else, Let _iteratorRecord_ be ? GetIteratorDirect(_O_). + 1. Let _iteratorRecord_ be ? GetIteratorFlattenable(_O_, ~sync~). + 1. Let _hasInstance_ be ? OrdinaryHasInstance(%Iterator%, _iteratorRecord_.[[Iterator]]). + 1. If _hasInstance_ is *true*, then + 1. Return _iteratorRecord_.[[Iterator]]. 1. Let _wrapper_ be OrdinaryObjectCreate(%WrapForValidIteratorPrototype%, « [[Iterated]] »). 1. Set _wrapper_.[[Iterated]] to _iteratorRecord_. 1. Return _wrapper_. @@ -392,21 +421,10 @@

AsyncIterator.prototype

AsyncIterator.from ( _O_ )

- 1. Let _usingIterator_ be ? GetMethod(_O_, @@asyncIterator). - 1. Let _iteratorRecord_ be *undefined*. - 1. If _usingIterator_ is not *undefined*, then - 1. Set _iteratorRecord_ to ? GetIterator(_O_, ~async~, _usingIterator_). - 1. If IsCallable(_iteratorRecord_.[[NextMethod]]) is *false*, throw a *TypeError* exception. - 1. Let _hasInstance_ be ? OrdinaryHasInstance(%AsyncIterator%, _iteratorRecord_.[[Iterator]]). - 1. If _hasInstance_ is *true*, then - 1. Return _iteratorRecord_.[[Iterator]]. - 1. If _iteratorRecord_ is *undefined*, then - 1. Set _usingIterator_ to ? GetMethod(_O_, @@iterator). - 1. If _usingIterator_ is not *undefined*, then - 1. Let _syncIteratorRecord_ be ? GetIterator(_O_, ~sync~, _usingIterator_). - 1. If IsCallable(_syncIteratorRecord_.[[NextMethod]]) is *false*, throw a *TypeError* exception. - 1. Set _iteratorRecord_ to CreateAsyncFromSyncIterator(_syncIteratorRecord_). - 1. If _iteratorRecord_ is *undefined*, set _iteratorRecord_ to ? GetIteratorDirect(_O_). + 1. Let _iteratorRecord_ be ? GetIteratorFlattenable(_O_, ~async~). + 1. Let _hasInstance_ be ? OrdinaryHasInstance(%AsyncIterator%, _iteratorRecord_.[[Iterator]]). + 1. If _hasInstance_ is *true*, then + 1. Return _iteratorRecord_.[[Iterator]]. 1. Let _wrapper_ be OrdinaryObjectCreate(%WrapForValidAsyncIteratorPrototype%, « [[AsyncIterated]] »). 1. Set _wrapper_.[[AsyncIterated]] to _iteratorRecord_. 1. Return _wrapper_. @@ -651,7 +669,7 @@

Iterator.prototype.flatMap ( _mapper_ )

1. Let _value_ be ? IteratorValue(_next_). 1. Let _mapped_ be Completion(Call(_mapper_, *undefined*, « _value_, 𝔽(_counter_) »)). 1. IfAbruptCloseIterator(_mapped_, _iterated_). - 1. Let _innerIterator_ be Completion(GetIterator(_mapped_, ~sync~)). + 1. Let _innerIterator_ be Completion(GetIteratorFlattenable(_mapped_, ~sync~)). 1. IfAbruptCloseIterator(_innerIterator_, _iterated_). 1. Let _innerAlive_ be *true*. 1. Repeat, while _innerAlive_ is *true*, @@ -928,7 +946,7 @@

AsyncIterator.prototype.flatMap ( _mapper_ )

1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_). 1. Set _mapped_ to Completion(Await(_mapped_)). 1. IfAbruptCloseAsyncIterator(_mapped_, _iterated_). - 1. Let _innerIterator_ be Completion(GetIterator(_mapped_, ~async~)). + 1. Let _innerIterator_ be Completion(GetIteratorFlattenable(_mapped_, ~async~)). 1. IfAbruptCloseAsyncIterator(_innerIterator_, _iterated_). 1. Let _innerAlive_ be *true*. 1. Repeat, while _innerAlive_ is *true*,