blob: a16bbba86f39349be108a3500be0c922e554ec96 [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var callBound = require('call-bind/callBound');
4var $arrayPush = callBound('Array.prototype.push');
5
6var getIteratorMethod = require('../helpers/getIteratorMethod');
7var AdvanceStringIndex = require('./AdvanceStringIndex');
8var GetIterator = require('./GetIterator');
9var GetMethod = require('./GetMethod');
10var IsArray = require('./IsArray');
11var IteratorStep = require('./IteratorStep');
12var IteratorValue = require('./IteratorValue');
13var ToObject = require('./ToObject');
14var Type = require('./Type');
15var ES = {
16 AdvanceStringIndex: AdvanceStringIndex,
17 GetMethod: GetMethod,
18 IsArray: IsArray,
19 Type: Type
20};
21
22// https://262.ecma-international.org/7.0/#sec-iterabletoarraylike
23/**
24 * 1. Let usingIterator be ? GetMethod(items, @@iterator).
25 * 2. If usingIterator is not undefined, then
26 * 1. Let iterator be ? GetIterator(items, usingIterator).
27 * 2. Let values be a new empty List.
28 * 3. Let next be true.
29 * 4. Repeat, while next is not false
30 * 1. Let next be ? IteratorStep(iterator).
31 * 2. If next is not false, then
32 * 1. Let nextValue be ? IteratorValue(next).
33 * 2. Append nextValue to the end of the List values.
34 * 5. Return CreateArrayFromList(values).
35 * 3. NOTE: items is not an Iterable so assume it is already an array-like object.
36 * 4. Return ! ToObject(items).
37 */
38
39module.exports = function IterableToArrayLike(items) {
40 var usingIterator = getIteratorMethod(ES, items);
41 if (typeof usingIterator !== 'undefined') {
42 var iterator = GetIterator(items, usingIterator);
43 var values = [];
44 var next = true;
45 while (next) {
46 next = IteratorStep(iterator);
47 if (next) {
48 var nextValue = IteratorValue(next);
49 $arrayPush(values, nextValue);
50 }
51 }
52 return values;
53 }
54
55 return ToObject(items);
56};