From e1eadbf664cc6e5afc44cd77c2cfc760e1e759d9 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Fri, 23 May 2014 14:23:42 -0400 Subject: [PATCH] erasePath fixes, and requal function --- route.js | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- tr.js | 9 +++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/route.js b/route.js index 3aed4a2..922ff21 100644 --- a/route.js +++ b/route.js @@ -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; diff --git a/tr.js b/tr.js index cac6aa8..b84ecd5 100644 --- a/tr.js +++ b/tr.js @@ -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));