181 lines
5.2 KiB
JavaScript
181 lines
5.2 KiB
JavaScript
|
/**
|
||
|
* @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;
|