'use strict'; 
 | 
var $ = require('../internals/export'); 
 | 
var globalThis = require('../internals/global-this'); 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var isForced = require('../internals/is-forced'); 
 | 
var defineBuiltIn = require('../internals/define-built-in'); 
 | 
var InternalMetadataModule = require('../internals/internal-metadata'); 
 | 
var iterate = require('../internals/iterate'); 
 | 
var anInstance = require('../internals/an-instance'); 
 | 
var isCallable = require('../internals/is-callable'); 
 | 
var isNullOrUndefined = require('../internals/is-null-or-undefined'); 
 | 
var isObject = require('../internals/is-object'); 
 | 
var fails = require('../internals/fails'); 
 | 
var checkCorrectnessOfIteration = require('../internals/check-correctness-of-iteration'); 
 | 
var setToStringTag = require('../internals/set-to-string-tag'); 
 | 
var inheritIfRequired = require('../internals/inherit-if-required'); 
 | 
  
 | 
module.exports = function (CONSTRUCTOR_NAME, wrapper, common) { 
 | 
  var IS_MAP = CONSTRUCTOR_NAME.indexOf('Map') !== -1; 
 | 
  var IS_WEAK = CONSTRUCTOR_NAME.indexOf('Weak') !== -1; 
 | 
  var ADDER = IS_MAP ? 'set' : 'add'; 
 | 
  var NativeConstructor = globalThis[CONSTRUCTOR_NAME]; 
 | 
  var NativePrototype = NativeConstructor && NativeConstructor.prototype; 
 | 
  var Constructor = NativeConstructor; 
 | 
  var exported = {}; 
 | 
  
 | 
  var fixMethod = function (KEY) { 
 | 
    var uncurriedNativeMethod = uncurryThis(NativePrototype[KEY]); 
 | 
    defineBuiltIn(NativePrototype, KEY, 
 | 
      KEY === 'add' ? function add(value) { 
 | 
        uncurriedNativeMethod(this, value === 0 ? 0 : value); 
 | 
        return this; 
 | 
      } : KEY === 'delete' ? function (key) { 
 | 
        return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); 
 | 
      } : KEY === 'get' ? function get(key) { 
 | 
        return IS_WEAK && !isObject(key) ? undefined : uncurriedNativeMethod(this, key === 0 ? 0 : key); 
 | 
      } : KEY === 'has' ? function has(key) { 
 | 
        return IS_WEAK && !isObject(key) ? false : uncurriedNativeMethod(this, key === 0 ? 0 : key); 
 | 
      } : function set(key, value) { 
 | 
        uncurriedNativeMethod(this, key === 0 ? 0 : key, value); 
 | 
        return this; 
 | 
      } 
 | 
    ); 
 | 
  }; 
 | 
  
 | 
  var REPLACE = isForced( 
 | 
    CONSTRUCTOR_NAME, 
 | 
    !isCallable(NativeConstructor) || !(IS_WEAK || NativePrototype.forEach && !fails(function () { 
 | 
      new NativeConstructor().entries().next(); 
 | 
    })) 
 | 
  ); 
 | 
  
 | 
  if (REPLACE) { 
 | 
    // create collection constructor 
 | 
    Constructor = common.getConstructor(wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER); 
 | 
    InternalMetadataModule.enable(); 
 | 
  } else if (isForced(CONSTRUCTOR_NAME, true)) { 
 | 
    var instance = new Constructor(); 
 | 
    // 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 
 | 
    // eslint-disable-next-line no-new -- required for testing 
 | 
    var ACCEPT_ITERABLES = checkCorrectnessOfIteration(function (iterable) { new NativeConstructor(iterable); }); 
 | 
    // 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 NativeConstructor(); 
 | 
      var index = 5; 
 | 
      while (index--) $instance[ADDER](index, index); 
 | 
      return !$instance.has(-0); 
 | 
    }); 
 | 
  
 | 
    if (!ACCEPT_ITERABLES) { 
 | 
      Constructor = wrapper(function (dummy, iterable) { 
 | 
        anInstance(dummy, NativePrototype); 
 | 
        var that = inheritIfRequired(new NativeConstructor(), dummy, Constructor); 
 | 
        if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); 
 | 
        return that; 
 | 
      }); 
 | 
      Constructor.prototype = NativePrototype; 
 | 
      NativePrototype.constructor = Constructor; 
 | 
    } 
 | 
  
 | 
    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 && NativePrototype.clear) delete NativePrototype.clear; 
 | 
  } 
 | 
  
 | 
  exported[CONSTRUCTOR_NAME] = Constructor; 
 | 
  $({ global: true, constructor: true, forced: Constructor !== NativeConstructor }, exported); 
 | 
  
 | 
  setToStringTag(Constructor, CONSTRUCTOR_NAME); 
 | 
  
 | 
  if (!IS_WEAK) common.setStrong(Constructor, CONSTRUCTOR_NAME, IS_MAP); 
 | 
  
 | 
  return Constructor; 
 | 
}; 
 |