Adjust projection to yield multiple values instead of a vector

This commit is contained in:
Tony Garnock-Jones 2014-05-28 19:44:35 -04:00
parent 420784bb11
commit a7212a02af
2 changed files with 33 additions and 20 deletions

View File

@ -761,9 +761,11 @@ function Routing(exports) {
} }
} }
function compileProjection(p) { function compileProjection(/* projection, projection, ... */) {
var acc = []; var acc = [];
walk(p); for (var i = 0; i < arguments.length; i++) {
walk(arguments[i]);
}
acc.push(EOA); acc.push(EOA);
return acc; return acc;
@ -819,13 +821,13 @@ function Routing(exports) {
} }
function project(m, spec) { function project(m, spec) {
return rseq(SOA, walk(false, m, 0)); return walk(false, m, 0);
function walk(isCapturing, m, specIndex) { function walk(isCapturing, m, specIndex) {
if (specIndex >= spec.length) { if (specIndex >= spec.length) {
if (isCapturing) die("Bad specification: unclosed capture"); if (isCapturing) die("Bad specification: unclosed capture");
if (m instanceof $Success) { if (m instanceof $Success) {
return rseq(EOA, rseq(EOA, rsuccess(projectSuccess(m.value)))); return rseq(EOA, rsuccess(projectSuccess(m.value)));
} else { } else {
return emptyMatcher; return emptyMatcher;
} }
@ -977,10 +979,10 @@ function Routing(exports) {
} }
function matcherKeys(m) { 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) { function walk(m, k) {
if (m === null) return [];
if (m instanceof $WildcardSequence) return null; if (m instanceof $WildcardSequence) return null;
if (m instanceof $Success) return []; if (m instanceof $Success) return [];
if (m.has(__)) return null; if (m.has(__)) return null;

39
tr.js
View File

@ -180,20 +180,31 @@ dumpM(r.union(r.compilePattern(r.arrayToSet('A'), [2]),
dumpM(r.union(r.compilePattern(r.arrayToSet('B'), [2]), dumpM(r.union(r.compilePattern(r.arrayToSet('B'), [2]),
r.compilePattern(r.arrayToSet('C'), [3]))))); r.compilePattern(r.arrayToSet('C'), [3])))));
console.log("matcherKeys on wild matchers"); (function () {
dump(r.matcherKeys(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), console.log("matcherKeys on wild matchers");
r.compilePattern(r.arrayToSet(['C']), [1, 3]), var M = r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]),
r.compilePattern(r.arrayToSet(['B']), [3, 4])), r.compilePattern(r.arrayToSet(['C']), [1, 3]),
r.compileProjection([r._$(), r._$()])))); r.compilePattern(r.arrayToSet(['B']), [3, 4]));
dump(r.matcherKeys(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), dump(r.matcherKeys(r.project(M, r.compileProjection([r._$(), r._$()]))));
r.compilePattern(r.arrayToSet(['C']), [1, 3]), dump(r.matcherKeys(r.project(M, r.compileProjection([r.__, r._$]))));
r.compilePattern(r.arrayToSet(['B']), [3, 4])), var M2 = r.project(M, r.compileProjection([r._$(), r._$()]));
r.compileProjection([r.__, r._$])))); dump(r.matcherKeys(r.project(M2,
dump(r.matcherKeys(r.project(r.project(r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]), r.compileProjection(r.__, r._$))));
r.compilePattern(r.arrayToSet(['C']), [1, 3]), dump(r.matcherKeys(r.project(r.compilePattern(true, [r.embeddedMatcher(M2)]),
r.compilePattern(r.arrayToSet(['B']), [3, 4])), r.compileProjection([r.__, r._$]))));
r.compileProjection([r._$(), r._$()])), dump(r.matcherKeys(r.project(r.compilePattern(true, [[r.embeddedMatcher(M2)]]),
r.compileProjection([r.__, r._$])))); 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 () { (function () {
console.log("serializeMatcher"); console.log("serializeMatcher");