erasePath fixes, and requal function

This commit is contained in:
Tony Garnock-Jones 2014-05-23 14:23:42 -04:00
parent cdea1507c4
commit e1eadbf664
2 changed files with 56 additions and 2 deletions

View File

@ -157,6 +157,32 @@ function Routing(exports) {
}
}
function requal(a, b) {
if (a === null) {
return (b === null);
}
if (b === null) return false;
if (a instanceof $WildcardSequence) {
if (!(b instanceof $WildcardSequence)) return false;
a = a.matcher;
b = b.matcher;
}
if (b instanceof $WildcardSequence) return false;
if (a instanceof $Success) {
if (!(b instanceof $Success)) return false;
return valuesEqual(a.value, b.value);
}
if (b instanceof $Success) return false;
for (var key in a.entries) {
if (!b.has(key)) return false;
if (!requal(a.entries[key], b.entries[key])) return false;
}
return true;
}
function is_keyOpen(k) {
return k === SOA;
}
@ -213,6 +239,20 @@ function Routing(exports) {
}
}
function setEqual(s1, s2) {
for (var key in s1) {
if (s1.hasOwnProperty(key)) {
if (s1[key] !== s2[key]) return false;
}
}
for (var key in s2) {
if (s2.hasOwnProperty(key)) {
if (s1[key] !== s2[key]) return false;
}
}
return true;
}
///////////////////////////////////////////////////////////////////////////
var unionSuccesses = function (v1, v2) {
@ -239,6 +279,10 @@ function Routing(exports) {
return v;
};
var valuesEqual = function (a, b) {
return setEqual(a, b);
};
///////////////////////////////////////////////////////////////////////////
function expandWildseq(r) {
@ -438,14 +482,15 @@ function Routing(exports) {
target = r1.copy();
for (var key in r2.entries) examineKey(key);
} else {
target = rwild(w);
target = new $Dict();
rupdateInplace(target, __, w);
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
return target.emptyGuard();
function examineKey(key) {
if ((key !== __) && !target.has(key)) {
if (key !== __) {
var k1 = r1.get(key);
var k2 = r2.get(key);
var updatedK;

9
tr.js
View File

@ -52,3 +52,12 @@ dump(r.matcherKeys(r.project(r.union(r.compilePattern(r.newSet('A'), [1, 2]),
r.compilePattern(r.newSet('C'), [1, 3]),
r.compilePattern(r.newSet('B'), [3, 4])),
r.compileProjection([r._$(), r._$()]))));
var R1 = r.compilePattern(r.newSet('A'), [r.__, "B"]);
var R2 = r.compilePattern(r.newSet('B'), ["A", r.__]);
var R12 = r.union(R1, R2);
dumpM(R1);
dumpM(R2);
dumpM(R12);
dumpM(r.erasePath(R12, R1));
dumpM(r.erasePath(R12, R2));