'use strict';
|
var fails = require('../internals/fails');
|
var isCallable = require('../internals/is-callable');
|
var create = require('../internals/object-create');
|
var getPrototypeOf = require('../internals/object-get-prototype-of');
|
var defineBuiltIn = require('../internals/define-built-in');
|
var wellKnownSymbol = require('../internals/well-known-symbol');
|
var IS_PURE = require('../internals/is-pure');
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
var BUGGY_SAFARI_ITERATORS = false;
|
|
// `%IteratorPrototype%` object
|
// https://tc39.es/ecma262/#sec-%iteratorprototype%-object
|
var IteratorPrototype, PrototypeOfArrayIteratorPrototype, arrayIterator;
|
|
/* eslint-disable es-x/no-array-prototype-keys -- safe */
|
if ([].keys) {
|
arrayIterator = [].keys();
|
// Safari 8 has buggy iterators w/o `next`
|
if (!('next' in arrayIterator)) BUGGY_SAFARI_ITERATORS = true;
|
else {
|
PrototypeOfArrayIteratorPrototype = getPrototypeOf(getPrototypeOf(arrayIterator));
|
if (PrototypeOfArrayIteratorPrototype !== Object.prototype) IteratorPrototype = PrototypeOfArrayIteratorPrototype;
|
}
|
}
|
|
var NEW_ITERATOR_PROTOTYPE = IteratorPrototype == undefined || fails(function () {
|
var test = {};
|
// FF44- legacy iterators case
|
return IteratorPrototype[ITERATOR].call(test) !== test;
|
});
|
|
if (NEW_ITERATOR_PROTOTYPE) IteratorPrototype = {};
|
else if (IS_PURE) IteratorPrototype = create(IteratorPrototype);
|
|
// `%IteratorPrototype%[@@iterator]()` method
|
// https://tc39.es/ecma262/#sec-%iteratorprototype%-@@iterator
|
if (!isCallable(IteratorPrototype[ITERATOR])) {
|
defineBuiltIn(IteratorPrototype, ITERATOR, function () {
|
return this;
|
});
|
}
|
|
module.exports = {
|
IteratorPrototype: IteratorPrototype,
|
BUGGY_SAFARI_ITERATORS: BUGGY_SAFARI_ITERATORS
|
};
|