You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
99 lines
4.4 KiB
99 lines
4.4 KiB
'use strict'; |
|
var $ = require('../internals/export'); |
|
var call = require('../internals/function-call'); |
|
var IS_PURE = require('../internals/is-pure'); |
|
var FunctionName = require('../internals/function-name'); |
|
var isCallable = require('../internals/is-callable'); |
|
var createIteratorConstructor = require('../internals/create-iterator-constructor'); |
|
var getPrototypeOf = require('../internals/object-get-prototype-of'); |
|
var setPrototypeOf = require('../internals/object-set-prototype-of'); |
|
var setToStringTag = require('../internals/set-to-string-tag'); |
|
var createNonEnumerableProperty = require('../internals/create-non-enumerable-property'); |
|
var redefine = require('../internals/redefine'); |
|
var wellKnownSymbol = require('../internals/well-known-symbol'); |
|
var Iterators = require('../internals/iterators'); |
|
var IteratorsCore = require('../internals/iterators-core'); |
|
|
|
var PROPER_FUNCTION_NAME = FunctionName.PROPER; |
|
var CONFIGURABLE_FUNCTION_NAME = FunctionName.CONFIGURABLE; |
|
var IteratorPrototype = IteratorsCore.IteratorPrototype; |
|
var BUGGY_SAFARI_ITERATORS = IteratorsCore.BUGGY_SAFARI_ITERATORS; |
|
var ITERATOR = wellKnownSymbol('iterator'); |
|
var KEYS = 'keys'; |
|
var VALUES = 'values'; |
|
var ENTRIES = 'entries'; |
|
|
|
var returnThis = function () { return this; }; |
|
|
|
module.exports = function (Iterable, NAME, IteratorConstructor, next, DEFAULT, IS_SET, FORCED) { |
|
createIteratorConstructor(IteratorConstructor, NAME, next); |
|
|
|
var getIterationMethod = function (KIND) { |
|
if (KIND === DEFAULT && defaultIterator) return defaultIterator; |
|
if (!BUGGY_SAFARI_ITERATORS && KIND in IterablePrototype) return IterablePrototype[KIND]; |
|
switch (KIND) { |
|
case KEYS: return function keys() { return new IteratorConstructor(this, KIND); }; |
|
case VALUES: return function values() { return new IteratorConstructor(this, KIND); }; |
|
case ENTRIES: return function entries() { return new IteratorConstructor(this, KIND); }; |
|
} return function () { return new IteratorConstructor(this); }; |
|
}; |
|
|
|
var TO_STRING_TAG = NAME + ' Iterator'; |
|
var INCORRECT_VALUES_NAME = false; |
|
var IterablePrototype = Iterable.prototype; |
|
var nativeIterator = IterablePrototype[ITERATOR] |
|
|| IterablePrototype['@@iterator'] |
|
|| DEFAULT && IterablePrototype[DEFAULT]; |
|
var defaultIterator = !BUGGY_SAFARI_ITERATORS && nativeIterator || getIterationMethod(DEFAULT); |
|
var anyNativeIterator = NAME == 'Array' ? IterablePrototype.entries || nativeIterator : nativeIterator; |
|
var CurrentIteratorPrototype, methods, KEY; |
|
|
|
// fix native |
|
if (anyNativeIterator) { |
|
CurrentIteratorPrototype = getPrototypeOf(anyNativeIterator.call(new Iterable())); |
|
if (CurrentIteratorPrototype !== Object.prototype && CurrentIteratorPrototype.next) { |
|
if (!IS_PURE && getPrototypeOf(CurrentIteratorPrototype) !== IteratorPrototype) { |
|
if (setPrototypeOf) { |
|
setPrototypeOf(CurrentIteratorPrototype, IteratorPrototype); |
|
} else if (!isCallable(CurrentIteratorPrototype[ITERATOR])) { |
|
redefine(CurrentIteratorPrototype, ITERATOR, returnThis); |
|
} |
|
} |
|
// Set @@toStringTag to native iterators |
|
setToStringTag(CurrentIteratorPrototype, TO_STRING_TAG, true, true); |
|
if (IS_PURE) Iterators[TO_STRING_TAG] = returnThis; |
|
} |
|
} |
|
|
|
// fix Array.prototype.{ values, @@iterator }.name in V8 / FF |
|
if (PROPER_FUNCTION_NAME && DEFAULT == VALUES && nativeIterator && nativeIterator.name !== VALUES) { |
|
if (!IS_PURE && CONFIGURABLE_FUNCTION_NAME) { |
|
createNonEnumerableProperty(IterablePrototype, 'name', VALUES); |
|
} else { |
|
INCORRECT_VALUES_NAME = true; |
|
defaultIterator = function values() { return call(nativeIterator, this); }; |
|
} |
|
} |
|
|
|
// export additional methods |
|
if (DEFAULT) { |
|
methods = { |
|
values: getIterationMethod(VALUES), |
|
keys: IS_SET ? defaultIterator : getIterationMethod(KEYS), |
|
entries: getIterationMethod(ENTRIES) |
|
}; |
|
if (FORCED) for (KEY in methods) { |
|
if (BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME || !(KEY in IterablePrototype)) { |
|
redefine(IterablePrototype, KEY, methods[KEY]); |
|
} |
|
} else $({ target: NAME, proto: true, forced: BUGGY_SAFARI_ITERATORS || INCORRECT_VALUES_NAME }, methods); |
|
} |
|
|
|
// define iterator |
|
if ((!IS_PURE || FORCED) && IterablePrototype[ITERATOR] !== defaultIterator) { |
|
redefine(IterablePrototype, ITERATOR, defaultIterator, { name: DEFAULT }); |
|
} |
|
Iterators[NAME] = defaultIterator; |
|
|
|
return methods; |
|
};
|
|
|