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.
		
		
		
		
		
			
		
			
				
					86 lines
				
				3.2 KiB
			
		
		
			
		
	
	
					86 lines
				
				3.2 KiB
			| 
											3 years ago
										 | 'use strict'; | ||
|  | var global = require('./_global'); | ||
|  | var $export = require('./_export'); | ||
|  | var redefine = require('./_redefine'); | ||
|  | var redefineAll = require('./_redefine-all'); | ||
|  | var meta = require('./_meta'); | ||
|  | var forOf = require('./_for-of'); | ||
|  | var anInstance = require('./_an-instance'); | ||
|  | var isObject = require('./_is-object'); | ||
|  | var fails = require('./_fails'); | ||
|  | var $iterDetect = require('./_iter-detect'); | ||
|  | var setToStringTag = require('./_set-to-string-tag'); | ||
|  | var inheritIfRequired = require('./_inherit-if-required'); | ||
|  | 
 | ||
|  | module.exports = function (NAME, wrapper, methods, common, IS_MAP, IS_WEAK) { | ||
|  |   var Base = global[NAME]; | ||
|  |   var C = Base; | ||
|  |   var ADDER = IS_MAP ? 'set' : 'add'; | ||
|  |   var proto = C && C.prototype; | ||
|  |   var O = {}; | ||
|  |   var fixMethod = function (KEY) { | ||
|  |     var fn = proto[KEY]; | ||
|  |     redefine(proto, KEY, | ||
|  |       KEY == 'delete' ? function (a) { | ||
|  |         return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); | ||
|  |       } : KEY == 'has' ? function has(a) { | ||
|  |         return IS_WEAK && !isObject(a) ? false : fn.call(this, a === 0 ? 0 : a); | ||
|  |       } : KEY == 'get' ? function get(a) { | ||
|  |         return IS_WEAK && !isObject(a) ? undefined : fn.call(this, a === 0 ? 0 : a); | ||
|  |       } : KEY == 'add' ? function add(a) { fn.call(this, a === 0 ? 0 : a); return this; } | ||
|  |         : function set(a, b) { fn.call(this, a === 0 ? 0 : a, b); return this; } | ||
|  |     ); | ||
|  |   }; | ||
|  |   if (typeof C != 'function' || !(IS_WEAK || proto.forEach && !fails(function () { | ||
|  |     new C().entries().next(); | ||
|  |   }))) { | ||
|  |     // create collection constructor
 | ||
|  |     C = common.getConstructor(wrapper, NAME, IS_MAP, ADDER); | ||
|  |     redefineAll(C.prototype, methods); | ||
|  |     meta.NEED = true; | ||
|  |   } else { | ||
|  |     var instance = new C(); | ||
|  |     // early implementations not supports chaining
 | ||
|  |     var HASNT_CHAINING = instance[ADDER](IS_WEAK ? {} : -0, 1) != instance; | ||
|  |     // V8 ~  Chromium 40- weak-collections throws on primitives, but should return false
 | ||
|  |     var THROWS_ON_PRIMITIVES = fails(function () { instance.has(1); }); | ||
|  |     // most early implementations doesn't supports iterables, most modern - not close it correctly
 | ||
|  |     var ACCEPT_ITERABLES = $iterDetect(function (iter) { new C(iter); }); // eslint-disable-line no-new
 | ||
|  |     // for early implementations -0 and +0 not the same
 | ||
|  |     var BUGGY_ZERO = !IS_WEAK && fails(function () { | ||
|  |       // V8 ~ Chromium 42- fails only with 5+ elements
 | ||
|  |       var $instance = new C(); | ||
|  |       var index = 5; | ||
|  |       while (index--) $instance[ADDER](index, index); | ||
|  |       return !$instance.has(-0); | ||
|  |     }); | ||
|  |     if (!ACCEPT_ITERABLES) { | ||
|  |       C = wrapper(function (target, iterable) { | ||
|  |         anInstance(target, C, NAME); | ||
|  |         var that = inheritIfRequired(new Base(), target, C); | ||
|  |         if (iterable != undefined) forOf(iterable, IS_MAP, that[ADDER], that); | ||
|  |         return that; | ||
|  |       }); | ||
|  |       C.prototype = proto; | ||
|  |       proto.constructor = C; | ||
|  |     } | ||
|  |     if (THROWS_ON_PRIMITIVES || BUGGY_ZERO) { | ||
|  |       fixMethod('delete'); | ||
|  |       fixMethod('has'); | ||
|  |       IS_MAP && fixMethod('get'); | ||
|  |     } | ||
|  |     if (BUGGY_ZERO || HASNT_CHAINING) fixMethod(ADDER); | ||
|  |     // weak collections should not contains .clear method
 | ||
|  |     if (IS_WEAK && proto.clear) delete proto.clear; | ||
|  |   } | ||
|  | 
 | ||
|  |   setToStringTag(C, NAME); | ||
|  | 
 | ||
|  |   O[NAME] = C; | ||
|  |   $export($export.G + $export.W + $export.F * (C != Base), O); | ||
|  | 
 | ||
|  |   if (!IS_WEAK) common.setStrong(C, NAME, IS_MAP); | ||
|  | 
 | ||
|  |   return C; | ||
|  | }; |