serializeMatcher, deserializeMatcher

This commit is contained in:
Tony Garnock-Jones 2014-05-25 13:53:20 -04:00
parent 55335fa296
commit 80e20f7a01
2 changed files with 64 additions and 0 deletions

View File

@ -1021,6 +1021,54 @@ function Routing(exports) {
}
}
function serializeMatcher(m, serializeSuccess) {
return walk(m);
function walk(m) {
if (m instanceof $WildcardSequence) {
return ["...)", m.matcher];
}
if (m instanceof $Success) {
return ["", serializeSuccess(m.value)];
}
var acc = [];
for (var key in m.entries) {
var k = m.entries[key];
if (key === __) key = ["__"];
else if (key === SOA) key = ["("];
else if (key === EOA) key = [")"];
else key = JSON.parse(key);
acc.push([key, walk(k)]);
}
return acc;
}
}
function deserializeMatcher(r, deserializeSuccess) {
return walk(r);
function walk(r) {
if (r[0] === "...)") return rwildseq(walk(r[1]));
if (r[0] === "") return rsuccess(deserializeSuccess(r[1]));
var acc = new $Dict();
for (var i = 0; i < r.length; i++) {
var rkey = r[i][0];
var rk = r[i][1];
var key;
if (Array.isArray(rkey)) {
switch (rkey[0]) {
case "__": key = __; break;
case "(": key = SOA; break;
case ")": key = EOA; break;
default: die("Invalid serialized special key: " + rkey[0]);
}
} else {
key = JSON.stringify(rkey);
}
rupdateInplace(acc, key, walk(rk));
}
return acc;
}
}
///////////////////////////////////////////////////////////////////////////
// Gestalts.
// TODO: support Infinity as a level number
@ -1286,6 +1334,7 @@ function Routing(exports) {
exports.__ = __;
exports.arrayToSet = arrayToSet;
exports.setToArray = setToArray;
exports.setUnion = setUnion;
exports.setSubtract = setSubtract;
exports.setIntersect = setIntersect;
@ -1308,6 +1357,8 @@ function Routing(exports) {
exports.matcherKeys = matcherKeys;
exports.matcherEquals = matcherEquals;
exports.prettyMatcher = prettyMatcher;
exports.serializeMatcher = serializeMatcher;
exports.deserializeMatcher = deserializeMatcher;
exports.GestaltLevel = GestaltLevel;
exports.Gestalt = Gestalt;

13
tr.js
View File

@ -170,3 +170,16 @@ dump(r.matcherKeys(r.project(r.project(r.union(r.compilePattern(r.arrayToSet(['A
r.compilePattern(r.arrayToSet(['B']), [3, 4])),
r.compileProjection([r._$(), r._$()])),
r.compileProjection([r.__, r._$]))));
(function () {
console.log("serializeMatcher");
var M = r.union(r.compilePattern(r.arrayToSet(['A']), [r.__, 2]),
r.compilePattern(r.arrayToSet(['C']), [1, 3]),
r.compilePattern(r.arrayToSet(['D']), [r.__, 3]),
r.compilePattern(r.arrayToSet(['B']), [3, 4]));
var S = r.serializeMatcher(M, r.setToArray);
dump(S);
console.log(JSON.stringify(S));
dumpM(r.deserializeMatcher(S, r.arrayToSet));
dump(r.matcherEquals(M, r.deserializeMatcher(S, r.arrayToSet)) === true);
})();