Adjust projection to yield multiple values instead of a vector
This commit is contained in:
parent
420784bb11
commit
a7212a02af
14
route.js
14
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;
|
||||
|
|
39
tr.js
39
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");
|
||||
|
|
Loading…
Reference in New Issue