UNPKG

hashtbl

Version:

A hashtable library

108 lines (107 loc) 2.2 kB
"use strict"; var _ = require('underscore'); var type = function(){}; var hash = exports.hash = function(k) { if(typeof k.hashCode !== "function") { if(typeof k === "string") { return k; } else if(typeof k === "number") { return k; } else if(k instanceof type) { var h = ""; k.forEach(function(i, v){ h += hash(i) + hash(v); }); return h; } else { var h = ""; for(var i in k){ h += hash(i) + hash(k[i]); } return h; } } }; var clean = exports.clean = function(obj) { var hasprop = Object.prototype.hasOwnProperty; var c = Object.create(null); for(var k in obj) { if(hasprop.call(obj,k)) { c[k] = obj[k]; } } return c; }; var equal = exports.equal = function(a, v) { if(a instanceof type && v instanceof type) { var b = false; var ks = []; a.forEach(function(k) { ks.push(k); }); v.forEach(function(k){ ks.push(k); }); ks.sort(); return _.all(_.uniq(ks, true), function(k){ return equal(a[k], v[k]); }); } else { return _.isEqual(a, v); } } var create = exports.create = function(obj) { var self = new type(); var tbl = {}; var forEach = self.forEach = function(f) { for(var a in tbl) { for(var b in tbl[a]) { f(tbl[a][b][0], tbl[a][b][1]); } } }; var map = self.map = function(f) { var acc = []; forEach(function(k, v) { acc.push(f(k,v)); }); return acc; }; var set = self.set = function(k, v) { var h = hash(k); if(tbl[h]) { var res = _.find(tbl[h], function(v) { return equal(k, v[0]); }); if(typeof res !== 'undefined'){ res[0] = k; res[1] = v; } else { tbl[h].push([k,v]); } } else { tbl[h] = [[k, v]]; } }; var get = self.get = function(k) { var buckets = tbl[hash(k)]; var res = _.find(buckets, function(v) { return equal(k, v[0]); }); return res[1]; }; self.toString = function() { var res = "{"; var i = 0; forEach(function(k, v){ res += ((i++) ? ", " : "") + k + " : " + v; }); res += "}"; return res; }; var c = clean(obj); for(var k in c) { set(k, c[k]); } return self; };