It turns out that order-of-definition is a thing for browser JS, even if not for node.js

This commit is contained in:
Tony Garnock-Jones 2014-05-23 14:37:48 -04:00
parent 87c5aac69f
commit 1e3a8f7db0
1 changed files with 50 additions and 49 deletions

View File

@ -323,10 +323,6 @@ function Routing(exports) {
} }
return target.emptyGuard(); return target.emptyGuard();
} else { } else {
var target = rwild(w).copy();
for (var key in r1.entries) { examineKey(r1, key, r2); }
for (var key in r2.entries) { examineKey(r2, key, r1); }
return target;
function examineKey(rA, key, rB) { function examineKey(rA, key, rB) {
if ((key !== __) && !target.has(key)) { if ((key !== __) && !target.has(key)) {
var k = merge(rA.get(key), rB.get(key)); var k = merge(rA.get(key), rB.get(key));
@ -343,6 +339,10 @@ function Routing(exports) {
} }
} }
} }
var target = rwild(w).copy();
for (var key in r1.entries) { examineKey(r1, key, r2); }
for (var key in r2.entries) { examineKey(r2, key, r1); }
return target;
} }
} }
} }
@ -388,22 +388,6 @@ function Routing(exports) {
var w = walk(w1, w2); var w = walk(w1, w2);
var target = new $Dict(); var target = new $Dict();
if (is_emptyMatcher(w1)) {
if (is_emptyMatcher(w2)) {
for (var key in r1.smallerOf(r2).entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
}
} else {
if (is_emptyMatcher(w2)) {
for (var key in r2.entries) examineKey(key);
} else {
rupdateInplace(target, __, w);
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
}
return target.emptyGuard();
function examineKey(key) { function examineKey(key) {
if ((key !== __) && !target.has(key)) { if ((key !== __) && !target.has(key)) {
@ -424,6 +408,23 @@ function Routing(exports) {
} }
} }
} }
if (is_emptyMatcher(w1)) {
if (is_emptyMatcher(w2)) {
for (var key in r1.smallerOf(r2).entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
}
} else {
if (is_emptyMatcher(w2)) {
for (var key in r2.entries) examineKey(key);
} else {
rupdateInplace(target, __, w);
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
}
return target.emptyGuard();
} }
function walkWild(walker, w, key, k) { function walkWild(walker, w, key, k) {
@ -478,17 +479,6 @@ function Routing(exports) {
var w = walk(w1, w2); var w = walk(w1, w2);
var target; var target;
if (is_emptyMatcher(w2)) {
target = r1.copy();
for (var key in r2.entries) examineKey(key);
} else {
target = new $Dict();
rupdateInplace(target, __, w);
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
return target.emptyGuard();
function examineKey(key) { function examineKey(key) {
if (key !== __) { if (key !== __) {
var k1 = r1.get(key); var k1 = r1.get(key);
@ -515,6 +505,17 @@ function Routing(exports) {
rupdateInplace(target, key, (requal(updatedK, w) ? emptyMatcher : updatedK)); rupdateInplace(target, key, (requal(updatedK, w) ? emptyMatcher : updatedK));
} }
} }
if (is_emptyMatcher(w2)) {
target = r1.copy();
for (var key in r2.entries) examineKey(key);
} else {
target = new $Dict();
rupdateInplace(target, __, w);
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
return target.emptyGuard();
} }
function walkWild(key, k, w) { function walkWild(key, k, w) {
@ -613,22 +614,6 @@ function Routing(exports) {
var w2 = r2.get(__); var w2 = r2.get(__);
walk(w1, w2); walk(w1, w2);
// Optimize similarly to intersect().
if (is_emptyMatcher(w1)) {
if (is_emptyMatcher(w2)) {
for (var key in r1.smallerOf(r2).entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
}
} else {
if (is_emptyMatcher(w2)) {
for (var key in r2.entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
}
function examineKey(key) { function examineKey(key) {
if (key !== __) { if (key !== __) {
var k1 = r1.get(key); var k1 = r1.get(key);
@ -648,6 +633,22 @@ function Routing(exports) {
} }
} }
} }
// Optimize similarly to intersect().
if (is_emptyMatcher(w1)) {
if (is_emptyMatcher(w2)) {
for (var key in r1.smallerOf(r2).entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
}
} else {
if (is_emptyMatcher(w2)) {
for (var key in r2.entries) examineKey(key);
} else {
for (var key in r1.entries) examineKey(key);
for (var key in r2.entries) examineKey(key);
}
}
} }
function walkWild(walker, w, key, k) { function walkWild(walker, w, key, k) {
@ -899,7 +900,6 @@ function Routing(exports) {
var mk = m.get(key); var mk = m.get(key);
var piece; var piece;
if (is_keyOpen(key)) { if (is_keyOpen(key)) {
piece = walkSeq(mk, seqK);
function seqK(vss, vsk) { function seqK(vss, vsk) {
var acc = []; var acc = [];
for (var i = 0; i < vss.length; i++) { for (var i = 0; i < vss.length; i++) {
@ -908,6 +908,7 @@ function Routing(exports) {
} }
return acc; return acc;
} }
piece = walkSeq(mk, seqK);
} else if (is_keyClose(key)) { } else if (is_keyClose(key)) {
die("matcherKeys: internal error: unexpected key-close"); die("matcherKeys: internal error: unexpected key-close");
} else { } else {
@ -930,7 +931,6 @@ function Routing(exports) {
if (is_keyClose(key)) { if (is_keyClose(key)) {
piece = k([[]], mk); piece = k([[]], mk);
} else { } else {
piece = walk(rseq(key, mk), outerK);
function outerK(v, vk) { function outerK(v, vk) {
return walkSeq(vk, innerK); return walkSeq(vk, innerK);
function innerK(vss, vsk) { function innerK(vss, vsk) {
@ -943,6 +943,7 @@ function Routing(exports) {
return k(acc, vsk); return k(acc, vsk);
} }
} }
piece = walk(rseq(key, mk), outerK);
} }
if (piece == null) return null; if (piece == null) return null;
acc = acc.concat(piece); acc = acc.concat(piece);