2 // https://github.com/tc39/proposal-iterator-helpers
3 var $ = require('../internals/export');
4 var global = require('../internals/global');
5 var anInstance = require('../internals/an-instance');
6 var isCallable = require('../internals/is-callable');
7 var createNonEnumerableProperty = require('../internals/create-non-enumerable-property');
8 var fails = require('../internals/fails');
9 var hasOwn = require('../internals/has-own-property');
10 var wellKnownSymbol = require('../internals/well-known-symbol');
11 var IteratorPrototype = require('../internals/iterators-core').IteratorPrototype;
12 var IS_PURE = require('../internals/is-pure');
14 var TO_STRING_TAG = wellKnownSymbol('toStringTag');
16 var NativeIterator = global.Iterator;
18 // FF56- have non-standard global helper `Iterator`
20 || !isCallable(NativeIterator)
21 || NativeIterator.prototype !== IteratorPrototype
22 // FF44- non-standard `Iterator` passes previous tests
23 || !fails(function () { NativeIterator({}); });
25 var IteratorConstructor = function Iterator() {
26 anInstance(this, IteratorPrototype);
29 if (!hasOwn(IteratorPrototype, TO_STRING_TAG)) {
30 createNonEnumerableProperty(IteratorPrototype, TO_STRING_TAG, 'Iterator');
33 if (FORCED || !hasOwn(IteratorPrototype, 'constructor') || IteratorPrototype.constructor === Object) {
34 createNonEnumerableProperty(IteratorPrototype, 'constructor', IteratorConstructor);
37 IteratorConstructor.prototype = IteratorPrototype;
39 $({ global: true, forced: FORCED }, {
40 Iterator: IteratorConstructor