(function(baselib) { // Union/find for circular equality testing. var UnionFind = function() { // this.parenMap holds the arrows from an arbitrary pointer // to its parent. this.parentMap = baselib.hashes.makeLowLevelEqHash(); } // find: ptr -> UnionFindNode // Returns the representative for this ptr. UnionFind.prototype.find = function(ptr) { var parent = (this.parentMap.containsKey(ptr) ? this.parentMap.get(ptr) : ptr); if (parent === ptr) { return parent; } else { var rep = this.find(parent); // Path compression: this.parentMap.put(ptr, rep); return rep; } }; // merge: ptr ptr -> void // Merge the representative nodes for ptr1 and ptr2. UnionFind.prototype.merge = function(ptr1, ptr2) { this.parentMap.put(this.find(ptr1), this.find(ptr2)); }; baselib.UnionFind = UnionFind; })(this['plt'].baselib);