hashtbl
Version:
A hashtable library
108 lines (107 loc) • 2.2 kB
JavaScript
;
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;
};