From a7212a02af4fa8be69c6bd544c6213f51178e2e0 Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Wed, 28 May 2014 19:44:35 -0400 Subject: [PATCH] Adjust projection to yield multiple values instead of a vector --- route.js | 14 ++++++++------ tr.js | 39 +++++++++++++++++++++++++-------------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/route.js b/route.js index f314280..7318f84 100644 --- a/route.js +++ b/route.js @@ -761,9 +761,11 @@ function Routing(exports) { } } - function compileProjection(p) { + function compileProjection(/* projection, projection, ... */) { var acc = []; - walk(p); + for (var i = 0; i < arguments.length; i++) { + walk(arguments[i]); + } acc.push(EOA); return acc; @@ -819,13 +821,13 @@ function Routing(exports) { } function project(m, spec) { - return rseq(SOA, walk(false, m, 0)); + return walk(false, m, 0); function walk(isCapturing, m, specIndex) { if (specIndex >= spec.length) { if (isCapturing) die("Bad specification: unclosed capture"); if (m instanceof $Success) { - return rseq(EOA, rseq(EOA, rsuccess(projectSuccess(m.value)))); + return rseq(EOA, rsuccess(projectSuccess(m.value))); } else { return emptyMatcher; } @@ -977,10 +979,10 @@ function Routing(exports) { } function matcherKeys(m) { - return walk(m, function (v, k) { return [v]; }); + if (is_emptyMatcher(m)) return []; + return walkSeq(m, function (vss, vsk) { return vss; }); function walk(m, k) { - if (m === null) return []; if (m instanceof $WildcardSequence) return null; if (m instanceof $Success) return []; if (m.has(__)) return null; diff --git a/tr.js b/tr.js index e611c5d..ee8b973 100644 --- a/tr.js +++ b/tr.js @@ -180,20 +180,31 @@ dumpM(r.union(r.compilePattern(r.arrayToSet('A'), [2]), dumpM(r.union(r.compilePattern(r.arrayToSet('B'), [2]), r.compilePattern(r.arrayToSet('C'), [3]))))); -console.log("matcherKeys on wild matchers"); -dump(r.matcherKeys(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), - r.compilePattern(r.arrayToSet(['C']), [1, 3]), - r.compilePattern(r.arrayToSet(['B']), [3, 4])), - r.compileProjection([r._$(), r._$()])))); -dump(r.matcherKeys(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), - r.compilePattern(r.arrayToSet(['C']), [1, 3]), - r.compilePattern(r.arrayToSet(['B']), [3, 4])), - r.compileProjection([r.__, r._$])))); -dump(r.matcherKeys(r.project(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), - r.compilePattern(r.arrayToSet(['C']), [1, 3]), - r.compilePattern(r.arrayToSet(['B']), [3, 4])), - r.compileProjection([r._$(), r._$()])), - r.compileProjection([r.__, r._$])))); +(function () { + console.log("matcherKeys on wild matchers"); + var M = r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), + r.compilePattern(r.arrayToSet(['C']), [1, 3]), + r.compilePattern(r.arrayToSet(['B']), [3, 4])); + dump(r.matcherKeys(r.project(M, r.compileProjection([r._$(), r._$()])))); + dump(r.matcherKeys(r.project(M, r.compileProjection([r.__, r._$])))); + var M2 = r.project(M, r.compileProjection([r._$(), r._$()])); + dump(r.matcherKeys(r.project(M2, + r.compileProjection(r.__, r._$)))); + dump(r.matcherKeys(r.project(r.compilePattern(true, [r.embeddedMatcher(M2)]), + r.compileProjection([r.__, r._$])))); + dump(r.matcherKeys(r.project(r.compilePattern(true, [[r.embeddedMatcher(M2)]]), + r.compileProjection([[r.__, r._$]])))); +})(); + +(function () { + console.log("matcherKeys using multiple-values in projections"); + var M = r.union(r.compilePattern(r.arrayToSet(['A']), [1, 2]), + r.compilePattern(r.arrayToSet(['C']), [1, 3]), + r.compilePattern(r.arrayToSet(['B']), [3, 4])); + var M2 = r.project(M, r.compileProjection([r._$(), r._$()])); + dump(r.matcherKeys(M2)); + dump(r.matcherKeys(r.project(M2, r.compileProjection(r._$(), r._$())))); +})(); (function () { console.log("serializeMatcher");