Skip to content

Instantly share code, notes, and snippets.

@sampottinger
Created April 30, 2014 02:12
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sampottinger/a1cab9fb005e597ac1f3 to your computer and use it in GitHub Desktop.
Save sampottinger/a1cab9fb005e597ac1f3 to your computer and use it in GitHub Desktop.
Domenic dict for your browser.
"use strict";
var hasOwnProperty = Object.prototype.hasOwnProperty;
var MANGLE_STRING = "~";
function mangle(key) {
return MANGLE_STRING + key;
}
function unmangle(key) {
return key.substring(MANGLE_STRING.length);
}
function methods(obj, methodHash) {
for (var methodName in methodHash) {
Object.defineProperty(obj, methodName, {
value: methodHash[methodName],
configurable: true,
writable: true
});
}
}
function assertString(key) {
if (typeof key !== "string") {
throw new TypeError("key must be a string.");
}
}
window.dict = function(initializer) {
var store = Object.create(null);
var size = 0;
var dict = {};
methods(dict, {
get: function (key, defaultValue) {
assertString(key);
var mangled = mangle(key);
return mangled in store ? store[mangled] : defaultValue;
},
set: function (key, value) {
assertString(key);
var mangled = mangle(key);
if (!(mangled in store)) {
++size;
}
return store[mangled] = value;
},
has: function (key) {
assertString(key);
return mangle(key) in store;
},
delete: function (key) {
assertString(key);
var mangled = mangle(key);
if (mangled in store) {
--size;
delete store[mangled];
return true;
}
return false;
},
clear: function () {
store = Object.create(null);
size = 0;
},
forEach: function (callback, thisArg) {
if (typeof callback !== "function") {
throw new TypeError("`callback` must be a function");
}
for (var mangledKey in store) {
if (hasOwnProperty.call(store, mangledKey)) {
var key = unmangle(mangledKey);
var value = store[mangledKey];
callback.call(thisArg, value, key, dict);
}
}
}
});
Object.defineProperty(dict, "size", {
get: function () {
return size;
},
configurable: true
});
if (typeof initializer === "object" && initializer !== null) {
Object.keys(initializer).forEach(function (key) {
dict.set(key, initializer[key]);
});
}
return dict;
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment