-QHash = function(def) {\r
- this.__map = {};\r
- this.length = 0;\r
-\r
- if(def !== undefined) {\r
- var h = Object.prototype.hasOwnProperty;\r
- for (var k in def) {\r
- if(!h.call(def, k))\r
- continue;\r
- this.put(k, def[k]);\r
- }\r
- }\r
-};\r
-\r
-QHash.prototype.__toKey = function(key) {\r
- if(typeof(key) !== "string")\r
- throw new TypeError("Not a string: " + key);\r
- return key + "$";\r
-};\r
-\r
-QHash.prototype.get = function(key) {\r
- return this.__map[this.__toKey(key)];\r
-};\r
-\r
-QHash.prototype.put = function(key, value) {\r
- key = this.__toKey(key);\r
-\r
- var exists = key in this.__map;\r
- var oldValue = this.__map[key];\r
-\r
- this.__map[key] = value;\r
-\r
- if(!exists) {\r
- this.length++;\r
- return null;\r
- }\r
-\r
- return oldValue;\r
-};\r
-\r
-QHash.prototype.contains = function(key) {\r
- return this.__toKey(key) in this.__map;\r
-};\r
-\r
-QHash.prototype.remove = function(key) {\r
- key = this.__toKey(key);\r
-\r
- var exists = key in this.__map;\r
- if(!exists)\r
- return null;\r
-\r
- var oldValue = this.__map[key];\r
- delete this.__map[key];\r
- this.length--;\r
-\r
- return oldValue;\r
-};\r
-\r
-QHash.prototype.each = function(fn, def) {\r
- var h = Object.prototype.hasOwnProperty;\r
- var m = this.__map;\r
- for(var k in m) {\r
- if(!h.call(m, k))\r
- continue;\r
-\r
- var break_ = fn.call(def, k.substr(0, k.length - 1), m[k]) !== undefined;\r
- if(break_)\r
- return break_;\r
- }\r
-};\r
-\r
-QHash.prototype.isEmpty = function() {\r
- return this.length == 0;\r
-};\r
-\r
-QHash.prototype.map = function(fn, def) {\r
- var l = [];\r
- this.each(function(k, v) {\r
- l.push(fn.call(def, k, v));\r
- });\r
- return l;\r
-};\r
-\r
-QHash.prototype.keys = function() {\r
- return this.map(function(k) { return k; });\r
-};\r
-\r
-QHash.prototype.values = function() {\r
- return this.map(function(k, v) { return v; });\r
-};\r
-\r
-QHash.prototype.items = function() {\r
- return this.map(function(k, v) { return [k, v]; });\r
-};\r
-\r
-QHash.prototype.toString = function() {\r
- var m = this.map(function(k, v) {\r
- return k + "=" + v;\r
- }, this);\r
-\r
- return "{QHash length=" + this.length + " map={" + m + "}}";\r
-};\r
-\r
-QSet = function() {\r
- this.__map = new QHash();\r
-\r
- this.length = 0;\r
- for(var i=0;i<arguments.length;i++)\r
- this.add(arguments[i]);\r
-};\r
-\r
-QSet.prototype.add = function(value) {\r
- var v = this.__map.put(value, true);\r
- if(v !== true)\r
- this.length = this.__map.length;\r
-\r
- return v;\r
-};\r
-\r
-QSet.prototype.contains = function(value) {\r
- return this.__map.contains(value);\r
-};\r
-\r
-QSet.prototype.remove = function(value) {\r
- var v = this.__map.remove(value, true);\r
- if(v)\r
- this.length = this.__map.length;\r
-\r
- return v;\r
-};\r
-\r
-QSet.prototype.each = function(fn, def) {\r
- return this.__map.each(fn, def);\r
-};\r
-\r
-QSet.prototype.values = function() {\r
- return this.__map.keys();\r
-}\r
-\r
-QSet.prototype.isEmpty = function() {\r
- return this.length == 0;\r
-};\r
-\r
-QSet.prototype.map = function(fn, def) {\r
- return this.__map.map(fn, def);\r
-};\r
-\r
-QSet.prototype.toString = function(value) {\r
- return "{QSet length=" + this.length + " set={" + this.values() + "}}";\r
-};\r
+QHash = function(def) {
+ this.__map = {};
+ this.length = 0;
+
+ if(def !== undefined) {
+ var h = Object.prototype.hasOwnProperty;
+ for (var k in def) {
+ if(!h.call(def, k))
+ continue;
+ this.put(k, def[k]);
+ }
+ }
+};
+
+QHash.prototype.__toKey = function(key) {
+ if(typeof(key) !== "string")
+ throw new TypeError("Not a string: " + key);
+ return key + "$";
+};
+
+QHash.prototype.get = function(key) {
+ return this.__map[this.__toKey(key)];
+};
+
+QHash.prototype.put = function(key, value) {
+ key = this.__toKey(key);
+
+ var exists = key in this.__map;
+ var oldValue = this.__map[key];
+
+ this.__map[key] = value;
+
+ if(!exists) {
+ this.length++;
+ return null;
+ }
+
+ return oldValue;
+};
+
+QHash.prototype.contains = function(key) {
+ return this.__toKey(key) in this.__map;
+};
+
+QHash.prototype.remove = function(key) {
+ key = this.__toKey(key);
+
+ var exists = key in this.__map;
+ if(!exists)
+ return null;
+
+ var oldValue = this.__map[key];
+ delete this.__map[key];
+ this.length--;
+
+ return oldValue;
+};
+
+QHash.prototype.each = function(fn, def) {
+ var h = Object.prototype.hasOwnProperty;
+ var m = this.__map;
+ for(var k in m) {
+ if(!h.call(m, k))
+ continue;
+
+ var break_ = fn.call(def, k.substr(0, k.length - 1), m[k]) !== undefined;
+ if(break_)
+ return break_;
+ }
+};
+
+QHash.prototype.isEmpty = function() {
+ return this.length == 0;
+};
+
+QHash.prototype.map = function(fn, def) {
+ var l = [];
+ this.each(function(k, v) {
+ l.push(fn.call(def, k, v));
+ });
+ return l;
+};
+
+QHash.prototype.keys = function() {
+ return this.map(function(k) { return k; });
+};
+
+QHash.prototype.values = function() {
+ return this.map(function(k, v) { return v; });
+};
+
+QHash.prototype.items = function() {
+ return this.map(function(k, v) { return [k, v]; });
+};
+
+QHash.prototype.toString = function() {
+ var m = this.map(function(k, v) {
+ return k + "=" + v;
+ }, this);
+
+ return "{QHash length=" + this.length + " map={" + m + "}}";
+};
+
+QSet = function() {
+ this.__map = new QHash();
+
+ this.length = 0;
+ for(var i=0;i<arguments.length;i++)
+ this.add(arguments[i]);
+};
+
+QSet.prototype.add = function(value) {
+ var v = this.__map.put(value, true);
+ if(v !== true)
+ this.length = this.__map.length;
+
+ return v;
+};
+
+QSet.prototype.contains = function(value) {
+ return this.__map.contains(value);
+};
+
+QSet.prototype.remove = function(value) {
+ var v = this.__map.remove(value, true);
+ if(v)
+ this.length = this.__map.length;
+
+ return v;
+};
+
+QSet.prototype.each = function(fn, def) {
+ return this.__map.each(fn, def);
+};
+
+QSet.prototype.values = function() {
+ return this.__map.keys();
+}
+
+QSet.prototype.isEmpty = function() {
+ return this.length == 0;
+};
+
+QSet.prototype.map = function(fn, def) {
+ return this.__map.map(fn, def);
+};
+
+QSet.prototype.toString = function(value) {
+ return "{QSet length=" + this.length + " set={" + this.values() + "}}";
+};