| 1 | 'use strict';
|
|---|
| 2 |
|
|---|
| 3 | var GetIntrinsic = require('get-intrinsic');
|
|---|
| 4 |
|
|---|
| 5 | var $TypeError = require('es-errors/type');
|
|---|
| 6 | var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);
|
|---|
| 7 |
|
|---|
| 8 | var inspect = require('object-inspect');
|
|---|
| 9 | var hasSymbols = require('has-symbols')();
|
|---|
| 10 |
|
|---|
| 11 | var AdvanceStringIndex = require('./AdvanceStringIndex');
|
|---|
| 12 | var CreateAsyncFromSyncIterator = require('./CreateAsyncFromSyncIterator');
|
|---|
| 13 | var GetIteratorFromMethod = require('./GetIteratorFromMethod');
|
|---|
| 14 | var GetMethod = require('./GetMethod');
|
|---|
| 15 |
|
|---|
| 16 | var ES = {
|
|---|
| 17 | AdvanceStringIndex: AdvanceStringIndex,
|
|---|
| 18 | GetMethod: GetMethod
|
|---|
| 19 | };
|
|---|
| 20 |
|
|---|
| 21 | var getIteratorMethod = require('../helpers/getIteratorMethod');
|
|---|
| 22 |
|
|---|
| 23 | // https://262.ecma-international.org/14.0/#sec-getiterator
|
|---|
| 24 |
|
|---|
| 25 | module.exports = function GetIterator(obj, kind) {
|
|---|
| 26 | if (kind !== 'SYNC' && kind !== 'ASYNC') {
|
|---|
| 27 | throw new $TypeError("Assertion failed: `kind` must be one of 'sync' or 'async', got " + inspect(kind));
|
|---|
| 28 | }
|
|---|
| 29 |
|
|---|
| 30 | var method;
|
|---|
| 31 | if (kind === 'ASYNC') { // step 1
|
|---|
| 32 | if (hasSymbols && $asyncIterator) {
|
|---|
| 33 | method = GetMethod(obj, $asyncIterator); // step 1.a
|
|---|
| 34 | }
|
|---|
| 35 | }
|
|---|
| 36 | if (typeof method === 'undefined') { // step 1.b
|
|---|
| 37 | // var syncMethod = GetMethod(obj, $iterator); // step 1.b.i
|
|---|
| 38 | var syncMethod = getIteratorMethod(ES, obj);
|
|---|
| 39 | if (kind === 'ASYNC') {
|
|---|
| 40 | if (typeof syncMethod === 'undefined') {
|
|---|
| 41 | throw new $TypeError('iterator method is `undefined`'); // step 1.b.ii
|
|---|
| 42 | }
|
|---|
| 43 | var syncIteratorRecord = GetIteratorFromMethod(obj, syncMethod); // step 1.b.iii
|
|---|
| 44 | return CreateAsyncFromSyncIterator(syncIteratorRecord); // step 1.b.iv
|
|---|
| 45 | }
|
|---|
| 46 | method = syncMethod; // step 2, kind of
|
|---|
| 47 | }
|
|---|
| 48 |
|
|---|
| 49 | if (typeof method === 'undefined') {
|
|---|
| 50 | throw new $TypeError('iterator method is `undefined`'); // step 3
|
|---|
| 51 | }
|
|---|
| 52 | return GetIteratorFromMethod(obj, method); // step 4
|
|---|
| 53 | };
|
|---|