48 lines
1.6 KiB
JavaScript
48 lines
1.6 KiB
JavaScript
'use strict';
|
|
// https://github.com/tc39/proposal-iterator-helpers
|
|
var $ = require('../internals/export');
|
|
var global = require('../internals/global');
|
|
var anInstance = require('../internals/an-instance');
|
|
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
|
|
var fails = require('../internals/fails');
|
|
var has = require('../internals/has');
|
|
var wellKnownSymbol = require('../internals/well-known-symbol');
|
|
var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
|
|
var IS_PURE = require('../internals/is-pure');
|
|
|
|
var ITERATOR = wellKnownSymbol('iterator');
|
|
var TO_STRING_TAG = wellKnownSymbol('toStringTag');
|
|
|
|
var NativeIterator = global.Iterator;
|
|
|
|
// FF56- have non-standard global helper `Iterator`
|
|
var FORCED = IS_PURE
|
|
|| typeof NativeIterator != 'function'
|
|
|| NativeIterator.prototype !== IteratorPrototype
|
|
// FF44- non-standard `Iterator` passes previous tests
|
|
|| !fails(function () { NativeIterator({}); });
|
|
|
|
var IteratorConstructor = function Iterator() {
|
|
anInstance(this, IteratorConstructor);
|
|
};
|
|
|
|
if (IS_PURE) {
|
|
IteratorPrototype = {};
|
|
createNonEnumerableProperty(IteratorPrototype, ITERATOR, function () {
|
|
return this;
|
|
});
|
|
}
|
|
|
|
if (!has(IteratorPrototype, TO_STRING_TAG)) {
|
|
createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator');
|
|
}
|
|
|
|
if (FORCED || !has(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) {
|
|
createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor);
|
|
}
|
|
|
|
IteratorConstructor.prototype = IteratorPrototype;
|
|
|
|
$({ global: true, forced: FORCED }, {
|
|
Iterator: IteratorConstructor
|
|
});
|