--- /dev/null
+'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
+});