| 'use strict'; |
| |
| var GetIntrinsic = require('../GetIntrinsic'); |
| |
| var $iterator = GetIntrinsic('%Symbol.iterator%', true); |
| |
| var callBound = require('../helpers/callBound'); |
| |
| var $arrayJoin = callBound('Array.prototype.join'); |
| var $arrayPush = callBound('Array.prototype.push'); |
| var $stringSlice = callBound('String.prototype.slice'); |
| var $stringSplit = callBound('String.prototype.split'); |
| |
| var AdvanceStringIndex = require('./AdvanceStringIndex'); |
| var GetIterator = require('./GetIterator'); |
| var GetMethod = require('./GetMethod'); |
| var IsArray = require('./IsArray'); |
| var IteratorStep = require('./IteratorStep'); |
| var IteratorValue = require('./IteratorValue'); |
| var ToObject = require('./ToObject'); |
| var Type = require('./Type'); |
| |
| // https://www.ecma-international.org/ecma-262/7.0/#sec-iterabletoarraylike |
| |
| module.exports = function IterableToArrayLike(items) { |
| var usingIterator; |
| if ($iterator) { |
| usingIterator = GetMethod(items, $iterator); |
| } else if (IsArray(items)) { |
| usingIterator = function () { |
| var i = -1; |
| var arr = this; // eslint-disable-line no-invalid-this |
| return { |
| next: function () { |
| i += 1; |
| return { |
| done: i >= arr.length, |
| value: arr[i] |
| }; |
| } |
| }; |
| }; |
| } else if (Type(items) === 'String') { |
| usingIterator = function () { |
| var i = 0; |
| return { |
| next: function () { |
| var nextIndex = AdvanceStringIndex(items, i, true); |
| var value = $arrayJoin($stringSplit($stringSlice(items, i, nextIndex), ''), ''); |
| i = nextIndex; |
| return { |
| done: nextIndex > items.length, |
| value: value |
| }; |
| } |
| }; |
| }; |
| } |
| if (typeof usingIterator !== 'undefined') { |
| var iterator = GetIterator(items, usingIterator); |
| var values = []; |
| var next = true; |
| while (next) { |
| next = IteratorStep(iterator); |
| if (next) { |
| var nextValue = IteratorValue(next); |
| $arrayPush(values, nextValue); |
| } |
| } |
| return values; |
| } |
| |
| return ToObject(items); |
| }; |