]> jfr.im git - irc/quakenet/qwebirc.git/blame - js/qhash.js
Merge.
[irc/quakenet/qwebirc.git] / js / qhash.js
CommitLineData
ea29e3d7
CP
1QHash = function(def) {\r
2 this.__map = {};\r
3 this.length = 0;\r
4\r
5 if(def !== undefined) {\r
6 var h = Object.prototype.hasOwnProperty;\r
7 for (var k in def) {\r
8 if(!h.call(def, k))\r
9 continue;\r
10 this.put(k, def[k]);\r
11 }\r
12 }\r
13};\r
14\r
15QHash.prototype.__toKey = function(key) {\r
16 if(typeof(key) !== "string")\r
17 throw new TypeError("Not a string: " + key);\r
18 return key + "$";\r
19};\r
20\r
21QHash.prototype.get = function(key) {\r
22 return this.__map[this.__toKey(key)];\r
23};\r
24\r
25QHash.prototype.put = function(key, value) {\r
26 key = this.__toKey(key);\r
27\r
28 var exists = key in this.__map;\r
29 var oldValue = this.__map[key];\r
30\r
31 this.__map[key] = value;\r
32\r
33 if(!exists) {\r
34 this.length++;\r
35 return null;\r
36 }\r
37\r
38 return oldValue;\r
39};\r
40\r
41QHash.prototype.contains = function(key) {\r
42 return this.__toKey(key) in this.__map;\r
43};\r
44\r
45QHash.prototype.remove = function(key) {\r
46 key = this.__toKey(key);\r
47\r
48 var exists = key in this.__map;\r
49 if(!exists)\r
50 return null;\r
51\r
52 var oldValue = this.__map[key];\r
53 delete this.__map[key];\r
54 this.length--;\r
55\r
56 return oldValue;\r
57};\r
58\r
59QHash.prototype.each = function(fn, def) {\r
60 var h = Object.prototype.hasOwnProperty;\r
61 var m = this.__map;\r
62 for(var k in m) {\r
63 if(!h.call(m, k))\r
64 continue;\r
65\r
66 var break_ = fn.call(def, k.substr(0, k.length - 1), m[k]) !== undefined;\r
67 if(break_)\r
68 return break_;\r
69 }\r
70};\r
71\r
72QHash.prototype.isEmpty = function() {\r
73 return this.length == 0;\r
74};\r
75\r
76QHash.prototype.map = function(fn, def) {\r
77 var l = [];\r
78 this.each(function(k, v) {\r
79 l.push(fn.call(def, k, v));\r
80 });\r
81 return l;\r
82};\r
83\r
84QHash.prototype.keys = function() {\r
85 return this.map(function(k) { return k; });\r
86};\r
87\r
88QHash.prototype.values = function() {\r
89 return this.map(function(k, v) { return v; });\r
90};\r
91\r
92QHash.prototype.items = function() {\r
93 return this.map(function(k, v) { return [k, v]; });\r
94};\r
95\r
96QHash.prototype.toString = function() {\r
97 var m = this.map(function(k, v) {\r
98 return k + "=" + v;\r
99 }, this);\r
100\r
101 return "{QHash length=" + this.length + " map={" + m + "}}";\r
102};\r
103\r
104QSet = function() {\r
105 this.__map = new QHash();\r
106\r
107 this.length = 0;\r
108 for(var i=0;i<arguments.length;i++)\r
109 this.add(arguments[i]);\r
110};\r
111\r
112QSet.prototype.add = function(value) {\r
113 var v = this.__map.put(value, true);\r
114 if(v !== true)\r
115 this.length = this.__map.length;\r
116\r
117 return v;\r
118};\r
119\r
120QSet.prototype.contains = function(value) {\r
121 return this.__map.contains(value);\r
122};\r
123\r
124QSet.prototype.remove = function(value) {\r
125 var v = this.__map.remove(value, true);\r
126 if(v)\r
127 this.length = this.__map.length;\r
128\r
129 return v;\r
130};\r
131\r
132QSet.prototype.each = function(fn, def) {\r
133 return this.__map.each(fn, def);\r
134};\r
135\r
136QSet.prototype.values = function() {\r
137 return this.__map.keys();\r
138}\r
139\r
140QSet.prototype.isEmpty = function() {\r
141 return this.length == 0;\r
142};\r
143\r
144QSet.prototype.map = function(fn, def) {\r
145 return this.__map.map(fn, def);\r
146};\r
147\r
148QSet.prototype.toString = function(value) {\r
149 return "{QSet length=" + this.length + " set={" + this.values() + "}}";\r
150};\r