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*,