/** * @generated SignedSource<<32241616e13b8a54d1a7baadce8eae5d>> * * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * !! This file is a check-in of a static_upstream project! !! * !! !! * !! You should not modify this file directly. Instead: !! * !! 1) Use `fjs use-upstream` to temporarily replace this with !! * !! the latest version from upstream. !! * !! 2) Make your changes, test them, etc. !! * !! 3) Use `fjs push-upstream` to copy your changes back to !! * !! static_upstream. !! * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! * * Copyright 2004-present Facebook. All Rights Reserved. * * @providesModule toIterator * */ /** * Given an object `toIterator` will return the itrator for that object. If the * object has a `Symbol.iterator` method we just call that. Otherwise we * implement the ES6 `Array` and `String` Iterator. */ /** * Constants */ var KIND_KEY = 'key'; var KIND_VALUE = 'value'; var KIND_KEY_VAL = 'key+value'; /*global Symbol: true*/ var ITERATOR_SYMBOL = (typeof Symbol === 'function') ? Symbol.iterator : '@@iterator'; var toIterator = (function() { if (!(Array.prototype[ITERATOR_SYMBOL] && String.prototype[ITERATOR_SYMBOL])) { // IIFE to avoid creating classes for no reason because of hoisting. return (function() { class ArrayIterator { // 22.1.5.1 CreateArrayIterator Abstract Operation constructor(array, kind) { if (!Array.isArray(array)) { throw new TypeError('Object is not an Array'); } this._iteratedObject = array; this._kind = kind; this._nextIndex = 0; } // 22.1.5.2.1 %ArrayIteratorPrototype%.next() next() { if (!this instanceof ArrayIterator) { throw new TypeError('Object is not an ArrayIterator'); } if (this._iteratedObject == null) { return createIterResultObject(undefined, true); } var array = this._iteratedObject; var len = this._iteratedObject.length; var index = this._nextIndex; var kind = this._kind; if (index >= len) { this._iteratedObject = undefined; return createIterResultObject(undefined, true); } this._nextIndex = index + 1; if (kind === KIND_KEY) { return createIterResultObject(index, false); } else if (kind === KIND_VALUE) { return createIterResultObject(array[index], false); } else if (kind === KIND_KEY_VAL) { return createIterResultObject([index, array[index]], false); } } // 22.1.5.2.2 %ArrayIteratorPrototype%[@@iterator]() '@@iterator'() { return this; } } class StringIterator { // 21.1.5.1 CreateStringIterator Abstract Operation constructor(string) { if (typeof string !== 'string') { throw new TypeError('Object is not a string'); } this._iteratedString = string; this._nextIndex = 0; } // 21.1.5.2.1 %StringIteratorPrototype%.next() next() { if (!this instanceof StringIterator) { throw new TypeError('Object is not a StringIterator'); } if (this._iteratedString == null) { return createIterResultObject(undefined, true); } var index = this._nextIndex; var s = this._iteratedString; var len = s.length; if (index >= len) { this._iteratedString = undefined; return createIterResultObject(undefined, true); } var ret; var first = s.charCodeAt(index); if (first < 0xD800 || first > 0xDBFF || index + 1 === len) { ret = s[index]; } else { var second = s.charCodeAt(index + 1); if (second < 0xDC00 || second > 0xDFFF) { ret = s[index]; } else { ret = s[index] + s[index + 1]; } } this._nextIndex = index + ret.length; return createIterResultObject(ret, false); } // 21.1.5.2.2 %StringIteratorPrototype%[@@ITERATOR_SYMBOL]() '@@iterator'() { return this; } } // 7.4.7 createIterResultObject(value, done) function createIterResultObject(value, done) { return {value: value, done: done}; } return function(object, kind) { if (typeof object === 'string') { return new StringIterator(object); } else if (Array.isArray(object)) { return new ArrayIterator(object, kind || KIND_VALUE); } else { return object[ITERATOR_SYMBOL](); } }; })(); } else { return function(object) { return object[ITERATOR_SYMBOL](); }; } })(); /** * Export constants */ Object.assign(toIterator, { KIND_KEY, KIND_VALUE, KIND_KEY_VAL, ITERATOR_SYMBOL }); module.exports = toIterator;