| 'use strict'; | 
|   | 
| var setPrototypeOf    = require('es5-ext/object/set-prototype-of') | 
|   , object            = require('es5-ext/object/valid-object') | 
|   , value             = require('es5-ext/object/valid-value') | 
|   , randomUniq        = require('es5-ext/string/random-uniq') | 
|   , d                 = require('d') | 
|   , getIterator       = require('es6-iterator/get') | 
|   , forOf             = require('es6-iterator/for-of') | 
|   , toStringTagSymbol = require('es6-symbol').toStringTag | 
|   , isNative          = require('./is-native-implemented') | 
|   | 
|   , isArray = Array.isArray, defineProperty = Object.defineProperty | 
|   , hasOwnProperty = Object.prototype.hasOwnProperty, getPrototypeOf = Object.getPrototypeOf | 
|   , WeakMapPoly; | 
|   | 
| module.exports = WeakMapPoly = function (/*iterable*/) { | 
|     var iterable = arguments[0], self; | 
|     if (!(this instanceof WeakMapPoly)) throw new TypeError('Constructor requires \'new\''); | 
|     if (isNative && setPrototypeOf && (WeakMap !== WeakMapPoly)) { | 
|         self = setPrototypeOf(new WeakMap(), getPrototypeOf(this)); | 
|     } else { | 
|         self = this; | 
|     } | 
|     if (iterable != null) { | 
|         if (!isArray(iterable)) iterable = getIterator(iterable); | 
|     } | 
|     defineProperty(self, '__weakMapData__', d('c', '$weakMap$' + randomUniq())); | 
|     if (!iterable) return self; | 
|     forOf(iterable, function (val) { | 
|         value(val); | 
|         self.set(val[0], val[1]); | 
|     }); | 
|     return self; | 
| }; | 
|   | 
| if (isNative) { | 
|     if (setPrototypeOf) setPrototypeOf(WeakMapPoly, WeakMap); | 
|     WeakMapPoly.prototype = Object.create(WeakMap.prototype, { | 
|         constructor: d(WeakMapPoly) | 
|     }); | 
| } | 
|   | 
| Object.defineProperties(WeakMapPoly.prototype, { | 
|     delete: d(function (key) { | 
|         if (hasOwnProperty.call(object(key), this.__weakMapData__)) { | 
|             delete key[this.__weakMapData__]; | 
|             return true; | 
|         } | 
|         return false; | 
|     }), | 
|     get: d(function (key) { | 
|         if (hasOwnProperty.call(object(key), this.__weakMapData__)) { | 
|             return key[this.__weakMapData__]; | 
|         } | 
|     }), | 
|     has: d(function (key) { | 
|         return hasOwnProperty.call(object(key), this.__weakMapData__); | 
|     }), | 
|     set: d(function (key, value) { | 
|         defineProperty(object(key), this.__weakMapData__, d('c', value)); | 
|         return this; | 
|     }), | 
|     toString: d(function () { return '[object WeakMap]'; }) | 
| }); | 
| defineProperty(WeakMapPoly.prototype, toStringTagSymbol, d('c', 'WeakMap')); |