You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1.8 KiB
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							1.8 KiB
						
					
					
				| 'use strict';
 | |
| 
 | |
| var GetIntrinsic = require('get-intrinsic');
 | |
| 
 | |
| var $TypeError = require('es-errors/type');
 | |
| var $asyncIterator = GetIntrinsic('%Symbol.asyncIterator%', true);
 | |
| 
 | |
| var inspect = require('object-inspect');
 | |
| var hasSymbols = require('has-symbols')();
 | |
| 
 | |
| var AdvanceStringIndex = require('./AdvanceStringIndex');
 | |
| var CreateAsyncFromSyncIterator = require('./CreateAsyncFromSyncIterator');
 | |
| var GetIteratorFromMethod = require('./GetIteratorFromMethod');
 | |
| var GetMethod = require('./GetMethod');
 | |
| var IsArray = require('./IsArray');
 | |
| 
 | |
| var getIteratorMethod = require('../helpers/getIteratorMethod');
 | |
| 
 | |
| var ES = {
 | |
| 	AdvanceStringIndex: AdvanceStringIndex,
 | |
| 	GetMethod: GetMethod,
 | |
| 	IsArray: IsArray
 | |
| };
 | |
| 
 | |
| // https://262.ecma-international.org/14.0/#sec-getiterator
 | |
| 
 | |
| module.exports = function GetIterator(obj, kind) {
 | |
| 	if (kind !== 'sync' && kind !== 'async') {
 | |
| 		throw new $TypeError("Assertion failed: `kind` must be one of 'sync' or 'async', got " + inspect(kind));
 | |
| 	}
 | |
| 
 | |
| 	var method;
 | |
| 	if (kind === 'async') { // step 1
 | |
| 		if (hasSymbols && $asyncIterator) {
 | |
| 			method = GetMethod(obj, $asyncIterator); // step 1.a
 | |
| 		}
 | |
| 	}
 | |
| 	if (typeof method === 'undefined') { // step 1.b
 | |
| 		// var syncMethod = GetMethod(obj, $iterator); // step 1.b.i
 | |
| 		var syncMethod = getIteratorMethod(ES, obj);
 | |
| 		if (kind === 'async') {
 | |
| 			if (typeof syncMethod === 'undefined') {
 | |
| 				throw new $TypeError('iterator method is `undefined`'); // step 1.b.ii
 | |
| 			}
 | |
| 			var syncIteratorRecord = GetIteratorFromMethod(obj, syncMethod); // step 1.b.iii
 | |
| 			return CreateAsyncFromSyncIterator(syncIteratorRecord); // step 1.b.iv
 | |
| 		}
 | |
| 		method = syncMethod; // step 2, kind of
 | |
| 	}
 | |
| 
 | |
| 	if (typeof method === 'undefined') {
 | |
| 		throw new $TypeError('iterator method is `undefined`'); // step 3
 | |
| 	}
 | |
| 	return GetIteratorFromMethod(obj, method); // step 4
 | |
| };
 |