From 80e20f7a01accc8b8d715e75cf91b16be966284c Mon Sep 17 00:00:00 2001 From: Tony Garnock-Jones Date: Sun, 25 May 2014 13:53:20 -0400 Subject: [PATCH] serializeMatcher, deserializeMatcher --- route.js | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ tr.js | 13 +++++++++++++ 2 files changed, 64 insertions(+) diff --git a/route.js b/route.js index 7cc975f..d4eef88 100644 --- a/route.js +++ b/route.js @@ -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; diff --git a/tr.js b/tr.js index ab3ec8f..a322157 100644 --- a/tr.js +++ b/tr.js @@ -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); +})();