'use strict'; 
 | 
var uncurryThis = require('../internals/function-uncurry-this'); 
 | 
var defineBuiltIns = require('../internals/define-built-ins'); 
 | 
var getWeakData = require('../internals/internal-metadata').getWeakData; 
 | 
var anInstance = require('../internals/an-instance'); 
 | 
var anObject = require('../internals/an-object'); 
 | 
var isNullOrUndefined = require('../internals/is-null-or-undefined'); 
 | 
var isObject = require('../internals/is-object'); 
 | 
var iterate = require('../internals/iterate'); 
 | 
var ArrayIterationModule = require('../internals/array-iteration'); 
 | 
var hasOwn = require('../internals/has-own-property'); 
 | 
var InternalStateModule = require('../internals/internal-state'); 
 | 
  
 | 
var setInternalState = InternalStateModule.set; 
 | 
var internalStateGetterFor = InternalStateModule.getterFor; 
 | 
var find = ArrayIterationModule.find; 
 | 
var findIndex = ArrayIterationModule.findIndex; 
 | 
var splice = uncurryThis([].splice); 
 | 
var id = 0; 
 | 
  
 | 
// fallback for uncaught frozen keys 
 | 
var uncaughtFrozenStore = function (state) { 
 | 
  return state.frozen || (state.frozen = new UncaughtFrozenStore()); 
 | 
}; 
 | 
  
 | 
var UncaughtFrozenStore = function () { 
 | 
  this.entries = []; 
 | 
}; 
 | 
  
 | 
var findUncaughtFrozen = function (store, key) { 
 | 
  return find(store.entries, function (it) { 
 | 
    return it[0] === key; 
 | 
  }); 
 | 
}; 
 | 
  
 | 
UncaughtFrozenStore.prototype = { 
 | 
  get: function (key) { 
 | 
    var entry = findUncaughtFrozen(this, key); 
 | 
    if (entry) return entry[1]; 
 | 
  }, 
 | 
  has: function (key) { 
 | 
    return !!findUncaughtFrozen(this, key); 
 | 
  }, 
 | 
  set: function (key, value) { 
 | 
    var entry = findUncaughtFrozen(this, key); 
 | 
    if (entry) entry[1] = value; 
 | 
    else this.entries.push([key, value]); 
 | 
  }, 
 | 
  'delete': function (key) { 
 | 
    var index = findIndex(this.entries, function (it) { 
 | 
      return it[0] === key; 
 | 
    }); 
 | 
    if (~index) splice(this.entries, index, 1); 
 | 
    return !!~index; 
 | 
  } 
 | 
}; 
 | 
  
 | 
module.exports = { 
 | 
  getConstructor: function (wrapper, CONSTRUCTOR_NAME, IS_MAP, ADDER) { 
 | 
    var Constructor = wrapper(function (that, iterable) { 
 | 
      anInstance(that, Prototype); 
 | 
      setInternalState(that, { 
 | 
        type: CONSTRUCTOR_NAME, 
 | 
        id: id++, 
 | 
        frozen: null 
 | 
      }); 
 | 
      if (!isNullOrUndefined(iterable)) iterate(iterable, that[ADDER], { that: that, AS_ENTRIES: IS_MAP }); 
 | 
    }); 
 | 
  
 | 
    var Prototype = Constructor.prototype; 
 | 
  
 | 
    var getInternalState = internalStateGetterFor(CONSTRUCTOR_NAME); 
 | 
  
 | 
    var define = function (that, key, value) { 
 | 
      var state = getInternalState(that); 
 | 
      var data = getWeakData(anObject(key), true); 
 | 
      if (data === true) uncaughtFrozenStore(state).set(key, value); 
 | 
      else data[state.id] = value; 
 | 
      return that; 
 | 
    }; 
 | 
  
 | 
    defineBuiltIns(Prototype, { 
 | 
      // `{ WeakMap, WeakSet }.prototype.delete(key)` methods 
 | 
      // https://tc39.es/ecma262/#sec-weakmap.prototype.delete 
 | 
      // https://tc39.es/ecma262/#sec-weakset.prototype.delete 
 | 
      'delete': function (key) { 
 | 
        var state = getInternalState(this); 
 | 
        if (!isObject(key)) return false; 
 | 
        var data = getWeakData(key); 
 | 
        if (data === true) return uncaughtFrozenStore(state)['delete'](key); 
 | 
        return data && hasOwn(data, state.id) && delete data[state.id]; 
 | 
      }, 
 | 
      // `{ WeakMap, WeakSet }.prototype.has(key)` methods 
 | 
      // https://tc39.es/ecma262/#sec-weakmap.prototype.has 
 | 
      // https://tc39.es/ecma262/#sec-weakset.prototype.has 
 | 
      has: function has(key) { 
 | 
        var state = getInternalState(this); 
 | 
        if (!isObject(key)) return false; 
 | 
        var data = getWeakData(key); 
 | 
        if (data === true) return uncaughtFrozenStore(state).has(key); 
 | 
        return data && hasOwn(data, state.id); 
 | 
      } 
 | 
    }); 
 | 
  
 | 
    defineBuiltIns(Prototype, IS_MAP ? { 
 | 
      // `WeakMap.prototype.get(key)` method 
 | 
      // https://tc39.es/ecma262/#sec-weakmap.prototype.get 
 | 
      get: function get(key) { 
 | 
        var state = getInternalState(this); 
 | 
        if (isObject(key)) { 
 | 
          var data = getWeakData(key); 
 | 
          if (data === true) return uncaughtFrozenStore(state).get(key); 
 | 
          if (data) return data[state.id]; 
 | 
        } 
 | 
      }, 
 | 
      // `WeakMap.prototype.set(key, value)` method 
 | 
      // https://tc39.es/ecma262/#sec-weakmap.prototype.set 
 | 
      set: function set(key, value) { 
 | 
        return define(this, key, value); 
 | 
      } 
 | 
    } : { 
 | 
      // `WeakSet.prototype.add(value)` method 
 | 
      // https://tc39.es/ecma262/#sec-weakset.prototype.add 
 | 
      add: function add(value) { 
 | 
        return define(this, value, true); 
 | 
      } 
 | 
    }); 
 | 
  
 | 
    return Constructor; 
 | 
  } 
 | 
}; 
 |