66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| "use strict";
 | |
| 
 | |
| var isValue           = require("es5-ext/object/is-value")
 | |
|   , setPrototypeOf    = require("es5-ext/object/set-prototype-of")
 | |
|   , object            = require("es5-ext/object/valid-object")
 | |
|   , ensureValue       = 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
 | |
|   , objHasOwnProperty = 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'");
 | |
| 	self = isNative && setPrototypeOf && (WeakMap !== WeakMapPoly)
 | |
| 		? setPrototypeOf(new WeakMap(), getPrototypeOf(this)) : this;
 | |
| 
 | |
| 	if (isValue(iterable)) {
 | |
| 		if (!isArray(iterable)) iterable = getIterator(iterable);
 | |
| 	}
 | |
| 	defineProperty(self, "__weakMapData__", d("c", "$weakMap$" + randomUniq()));
 | |
| 	if (!iterable) return self;
 | |
| 	forOf(iterable, function (val) {
 | |
| 		ensureValue(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 (objHasOwnProperty.call(object(key), this.__weakMapData__)) {
 | |
| 			delete key[this.__weakMapData__];
 | |
| 			return true;
 | |
| 		}
 | |
| 		return false;
 | |
| 	}),
 | |
| 	get: d(function (key) {
 | |
| 		if (!objHasOwnProperty.call(object(key), this.__weakMapData__)) return undefined;
 | |
| 		return key[this.__weakMapData__];
 | |
| 	}),
 | |
| 	has: d(function (key) {
 | |
| 		return objHasOwnProperty.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"));
 |