occam-languages 0.0.208 → 0.0.209

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,44 +21,29 @@ const _query = require("../utilities/query");
21
21
  const { match } = _necessary.arrayUtilities;
22
22
  const nonTerminalNodeQuery = (0, _query.nodeQuery)("/*");
23
23
  function areChildNodesCongruent(childNodesA, childNodesB) {
24
- let areChildNodesCongruent = false;
25
- const childNodesALength = childNodesA.length, childNodesBLength = childNodesB.length;
26
- if (childNodesALength === childNodesBLength) {
27
- const specificTerminalNodeMap = terminalNodeMapFromChildNodes(childNodesB), generalTerminalNodeMap = terminalNodeMapFromChildNodes(childNodesA), terminalNodeMapsEqual = areTerminalNodeMapsEqual(generalTerminalNodeMap, specificTerminalNodeMap);
28
- if (terminalNodeMapsEqual) {
29
- areChildNodesCongruent = true;
30
- }
31
- }
32
- return areChildNodesCongruent;
33
- }
34
- function terminalNodeMapFromChildNodes(childNodes) {
35
- const terminalNodeMap = {};
36
- childNodes.forEach((childNode, index)=>{
37
- const childNodeTerminalNode = childNode.isTerminalNode();
38
- if (childNodeTerminalNode) {
39
- const terminalNode = childNode; //
40
- terminalNodeMap[index] = terminalNode;
41
- }
42
- });
43
- return terminalNodeMap;
44
- }
45
- function areTerminalNodeMapsEqual(generalTerminalNodeMap, specificTerminalNodeMap) {
46
- let terminalNodeMapsEqual = false;
47
- const generalIndexes = Object.keys(generalTerminalNodeMap), specificIndexes = Object.keys(specificTerminalNodeMap), terminalNodeMapKeysMatch = match(generalIndexes, specificIndexes, (generalIndex, specificIndex)=>{
48
- if (generalIndex === specificIndex) {
24
+ const childNodesCongruent = match(childNodesA, childNodesB, (childNodeA, childNodeB)=>{
25
+ const childNodeCongruent = isChildNodeCongruent(childNodeA, childNodeB);
26
+ if (childNodeCongruent) {
49
27
  return true;
50
28
  }
51
29
  });
52
- if (terminalNodeMapKeysMatch) {
53
- const generalTerminalNodes = Object.values(generalTerminalNodeMap), specificTerminalNodes = Object.values(specificTerminalNodeMap), terminalNodeMapValuesMatch = match(generalTerminalNodes, specificTerminalNodes, (generalTerminalNode, specificTerminalNode)=>{
54
- const generalTerminalNodeMatchesSpecificTerminalNode = generalTerminalNode.match(specificTerminalNode);
55
- if (generalTerminalNodeMatchesSpecificTerminalNode) {
56
- return true;
30
+ return childNodesCongruent;
31
+ }
32
+ function isChildNodeCongruent(childNodeA, childNodeB) {
33
+ let childNodeCongruent = false;
34
+ const childNodeANonTerminalNode = childNodeA.isNonTerminalNode(), childNodeBNonTerminalNode = childNodeB.isNonTerminalNode();
35
+ if (childNodeANonTerminalNode && childNodeBNonTerminalNode) {
36
+ childNodeCongruent = true;
37
+ } else {
38
+ const childNodeATerminalNode = !childNodeANonTerminalNode, childNodeBTerminalNode = !childNodeBNonTerminalNode;
39
+ if (childNodeATerminalNode && childNodeBTerminalNode) {
40
+ const terminalNodeA = childNodeA, terminalNodeB = childNodeB, terminalNodeAMatchesTerminalNodeB = terminalNodeA.match(terminalNodeB);
41
+ if (terminalNodeAMatchesTerminalNodeB) {
42
+ childNodeCongruent = true;
57
43
  }
58
- });
59
- terminalNodeMapsEqual = terminalNodeMapValuesMatch; ///
44
+ }
60
45
  }
61
- return terminalNodeMapsEqual;
46
+ return childNodeCongruent;
62
47
  }
63
48
 
64
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvcGFzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcblxuY29uc3QgeyBtYXRjaCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBjb25zdCBub25UZXJtaW5hbE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi8qXCIpO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJlQ2hpbGROb2Rlc0NvbmdydWVudChjaGlsZE5vZGVzQSwgY2hpbGROb2Rlc0IpIHtcbiAgbGV0IGFyZUNoaWxkTm9kZXNDb25ncnVlbnQgPSBmYWxzZTtcblxuICBjb25zdCBjaGlsZE5vZGVzQUxlbmd0aCA9IGNoaWxkTm9kZXNBLmxlbmd0aCxcbiAgICAgICAgY2hpbGROb2Rlc0JMZW5ndGggPSBjaGlsZE5vZGVzQi5sZW5ndGg7XG5cbiAgaWYgKGNoaWxkTm9kZXNBTGVuZ3RoID09PSBjaGlsZE5vZGVzQkxlbmd0aCkge1xuICAgIGNvbnN0IHNwZWNpZmljVGVybWluYWxOb2RlTWFwID0gdGVybWluYWxOb2RlTWFwRnJvbUNoaWxkTm9kZXMoY2hpbGROb2Rlc0IpLFxuICAgICAgICAgIGdlbmVyYWxUZXJtaW5hbE5vZGVNYXAgPSB0ZXJtaW5hbE5vZGVNYXBGcm9tQ2hpbGROb2RlcyhjaGlsZE5vZGVzQSksXG4gICAgICAgICAgdGVybWluYWxOb2RlTWFwc0VxdWFsID0gYXJlVGVybWluYWxOb2RlTWFwc0VxdWFsKGdlbmVyYWxUZXJtaW5hbE5vZGVNYXAsIHNwZWNpZmljVGVybWluYWxOb2RlTWFwKTtcblxuICAgIGlmICh0ZXJtaW5hbE5vZGVNYXBzRXF1YWwpIHtcbiAgICAgIGFyZUNoaWxkTm9kZXNDb25ncnVlbnQgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBhcmVDaGlsZE5vZGVzQ29uZ3J1ZW50O1xufVxuXG5mdW5jdGlvbiB0ZXJtaW5hbE5vZGVNYXBGcm9tQ2hpbGROb2RlcyhjaGlsZE5vZGVzKSB7XG4gIGNvbnN0IHRlcm1pbmFsTm9kZU1hcCA9IHt9O1xuXG4gIGNoaWxkTm9kZXMuZm9yRWFjaCgoY2hpbGROb2RlLCBpbmRleCkgPT4ge1xuICAgIGNvbnN0IGNoaWxkTm9kZVRlcm1pbmFsTm9kZSA9IGNoaWxkTm9kZS5pc1Rlcm1pbmFsTm9kZSgpO1xuXG4gICAgaWYgKGNoaWxkTm9kZVRlcm1pbmFsTm9kZSkge1xuICAgICAgY29uc3QgdGVybWluYWxOb2RlID0gY2hpbGROb2RlOyAgLy9cblxuICAgICAgdGVybWluYWxOb2RlTWFwW2luZGV4XSA9IHRlcm1pbmFsTm9kZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiB0ZXJtaW5hbE5vZGVNYXA7XG59XG5cbmZ1bmN0aW9uIGFyZVRlcm1pbmFsTm9kZU1hcHNFcXVhbChnZW5lcmFsVGVybWluYWxOb2RlTWFwLCBzcGVjaWZpY1Rlcm1pbmFsTm9kZU1hcCkge1xuICBsZXQgdGVybWluYWxOb2RlTWFwc0VxdWFsID0gZmFsc2U7XG5cbiAgY29uc3QgZ2VuZXJhbEluZGV4ZXMgPSBPYmplY3Qua2V5cyhnZW5lcmFsVGVybWluYWxOb2RlTWFwKSwgLy8vXG4gICAgICAgIHNwZWNpZmljSW5kZXhlcyA9IE9iamVjdC5rZXlzKHNwZWNpZmljVGVybWluYWxOb2RlTWFwKSwgLy8vXG4gICAgICAgIHRlcm1pbmFsTm9kZU1hcEtleXNNYXRjaCA9IG1hdGNoKGdlbmVyYWxJbmRleGVzLCBzcGVjaWZpY0luZGV4ZXMsIChnZW5lcmFsSW5kZXgsIHNwZWNpZmljSW5kZXgpID0+IHtcbiAgICAgICAgICBpZiAoZ2VuZXJhbEluZGV4ID09PSBzcGVjaWZpY0luZGV4KSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gIGlmICh0ZXJtaW5hbE5vZGVNYXBLZXlzTWF0Y2gpIHtcbiAgICBjb25zdCBnZW5lcmFsVGVybWluYWxOb2RlcyA9IE9iamVjdC52YWx1ZXMoZ2VuZXJhbFRlcm1pbmFsTm9kZU1hcCksIC8vL1xuICAgICAgICAgIHNwZWNpZmljVGVybWluYWxOb2RlcyA9IE9iamVjdC52YWx1ZXMoc3BlY2lmaWNUZXJtaW5hbE5vZGVNYXApLCAvLy9cbiAgICAgICAgICB0ZXJtaW5hbE5vZGVNYXBWYWx1ZXNNYXRjaCA9IG1hdGNoKGdlbmVyYWxUZXJtaW5hbE5vZGVzLCBzcGVjaWZpY1Rlcm1pbmFsTm9kZXMsIChnZW5lcmFsVGVybWluYWxOb2RlLCBzcGVjaWZpY1Rlcm1pbmFsTm9kZSkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZ2VuZXJhbFRlcm1pbmFsTm9kZU1hdGNoZXNTcGVjaWZpY1Rlcm1pbmFsTm9kZSA9IGdlbmVyYWxUZXJtaW5hbE5vZGUubWF0Y2goc3BlY2lmaWNUZXJtaW5hbE5vZGUpO1xuXG4gICAgICAgICAgICBpZiAoZ2VuZXJhbFRlcm1pbmFsTm9kZU1hdGNoZXNTcGVjaWZpY1Rlcm1pbmFsTm9kZSkge1xuICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcblxuICAgIHRlcm1pbmFsTm9kZU1hcHNFcXVhbCA9IHRlcm1pbmFsTm9kZU1hcFZhbHVlc01hdGNoOyAvLy9cbiAgfVxuXG4gIHJldHVybiB0ZXJtaW5hbE5vZGVNYXBzRXF1YWw7XG59XG4iXSwibmFtZXMiOlsiYXJlQ2hpbGROb2Rlc0NvbmdydWVudCIsIm5vblRlcm1pbmFsTm9kZVF1ZXJ5IiwibWF0Y2giLCJhcnJheVV0aWxpdGllcyIsIm5vZGVRdWVyeSIsImNoaWxkTm9kZXNBIiwiY2hpbGROb2Rlc0IiLCJjaGlsZE5vZGVzQUxlbmd0aCIsImxlbmd0aCIsImNoaWxkTm9kZXNCTGVuZ3RoIiwic3BlY2lmaWNUZXJtaW5hbE5vZGVNYXAiLCJ0ZXJtaW5hbE5vZGVNYXBGcm9tQ2hpbGROb2RlcyIsImdlbmVyYWxUZXJtaW5hbE5vZGVNYXAiLCJ0ZXJtaW5hbE5vZGVNYXBzRXF1YWwiLCJhcmVUZXJtaW5hbE5vZGVNYXBzRXF1YWwiLCJjaGlsZE5vZGVzIiwidGVybWluYWxOb2RlTWFwIiwiZm9yRWFjaCIsImNoaWxkTm9kZSIsImluZGV4IiwiY2hpbGROb2RlVGVybWluYWxOb2RlIiwiaXNUZXJtaW5hbE5vZGUiLCJ0ZXJtaW5hbE5vZGUiLCJnZW5lcmFsSW5kZXhlcyIsIk9iamVjdCIsImtleXMiLCJzcGVjaWZpY0luZGV4ZXMiLCJ0ZXJtaW5hbE5vZGVNYXBLZXlzTWF0Y2giLCJnZW5lcmFsSW5kZXgiLCJzcGVjaWZpY0luZGV4IiwiZ2VuZXJhbFRlcm1pbmFsTm9kZXMiLCJ2YWx1ZXMiLCJzcGVjaWZpY1Rlcm1pbmFsTm9kZXMiLCJ0ZXJtaW5hbE5vZGVNYXBWYWx1ZXNNYXRjaCIsImdlbmVyYWxUZXJtaW5hbE5vZGUiLCJzcGVjaWZpY1Rlcm1pbmFsTm9kZSIsImdlbmVyYWxUZXJtaW5hbE5vZGVNYXRjaGVzU3BlY2lmaWNUZXJtaW5hbE5vZGUiXSwibWFwcGluZ3MiOiJBQUFBOzs7Ozs7Ozs7OztRQVVnQkE7ZUFBQUE7O1FBRkhDO2VBQUFBOzs7MkJBTmtCO3VCQUVMO0FBRTFCLE1BQU0sRUFBRUMsS0FBSyxFQUFFLEdBQUdDLHlCQUFjO0FBRXpCLE1BQU1GLHVCQUF1QkcsSUFBQUEsZ0JBQVMsRUFBQztBQUV2QyxTQUFTSix1QkFBdUJLLFdBQVcsRUFBRUMsV0FBVztJQUM3RCxJQUFJTix5QkFBeUI7SUFFN0IsTUFBTU8sb0JBQW9CRixZQUFZRyxNQUFNLEVBQ3RDQyxvQkFBb0JILFlBQVlFLE1BQU07SUFFNUMsSUFBSUQsc0JBQXNCRSxtQkFBbUI7UUFDM0MsTUFBTUMsMEJBQTBCQyw4QkFBOEJMLGNBQ3hETSx5QkFBeUJELDhCQUE4Qk4sY0FDdkRRLHdCQUF3QkMseUJBQXlCRix3QkFBd0JGO1FBRS9FLElBQUlHLHVCQUF1QjtZQUN6QmIseUJBQXlCO1FBQzNCO0lBQ0Y7SUFFQSxPQUFPQTtBQUNUO0FBRUEsU0FBU1csOEJBQThCSSxVQUFVO0lBQy9DLE1BQU1DLGtCQUFrQixDQUFDO0lBRXpCRCxXQUFXRSxPQUFPLENBQUMsQ0FBQ0MsV0FBV0M7UUFDN0IsTUFBTUMsd0JBQXdCRixVQUFVRyxjQUFjO1FBRXRELElBQUlELHVCQUF1QjtZQUN6QixNQUFNRSxlQUFlSixXQUFZLEVBQUU7WUFFbkNGLGVBQWUsQ0FBQ0csTUFBTSxHQUFHRztRQUMzQjtJQUNGO0lBRUEsT0FBT047QUFDVDtBQUVBLFNBQVNGLHlCQUF5QkYsc0JBQXNCLEVBQUVGLHVCQUF1QjtJQUMvRSxJQUFJRyx3QkFBd0I7SUFFNUIsTUFBTVUsaUJBQWlCQyxPQUFPQyxJQUFJLENBQUNiLHlCQUM3QmMsa0JBQWtCRixPQUFPQyxJQUFJLENBQUNmLDBCQUM5QmlCLDJCQUEyQnpCLE1BQU1xQixnQkFBZ0JHLGlCQUFpQixDQUFDRSxjQUFjQztRQUMvRSxJQUFJRCxpQkFBaUJDLGVBQWU7WUFDbEMsT0FBTztRQUNUO0lBQ0Y7SUFFTixJQUFJRiwwQkFBMEI7UUFDNUIsTUFBTUcsdUJBQXVCTixPQUFPTyxNQUFNLENBQUNuQix5QkFDckNvQix3QkFBd0JSLE9BQU9PLE1BQU0sQ0FBQ3JCLDBCQUN0Q3VCLDZCQUE2Qi9CLE1BQU00QixzQkFBc0JFLHVCQUF1QixDQUFDRSxxQkFBcUJDO1lBQ3BHLE1BQU1DLGlEQUFpREYsb0JBQW9CaEMsS0FBSyxDQUFDaUM7WUFFakYsSUFBSUMsZ0RBQWdEO2dCQUNsRCxPQUFPO1lBQ1Q7UUFDRjtRQUVOdkIsd0JBQXdCb0IsNEJBQTRCLEdBQUc7SUFDekQ7SUFFQSxPQUFPcEI7QUFDVCJ9
49
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlsaXRpZXMvcGFzcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyJcInVzZSBzdHJpY3RcIjtcblxuaW1wb3J0IHsgYXJyYXlVdGlsaXRpZXMgfSBmcm9tIFwibmVjZXNzYXJ5XCI7XG5cbmltcG9ydCB7IG5vZGVRdWVyeSB9IGZyb20gXCIuLi91dGlsaXRpZXMvcXVlcnlcIjtcblxuY29uc3QgeyBtYXRjaCB9ID0gYXJyYXlVdGlsaXRpZXM7XG5cbmV4cG9ydCBjb25zdCBub25UZXJtaW5hbE5vZGVRdWVyeSA9IG5vZGVRdWVyeShcIi8qXCIpO1xuXG5leHBvcnQgZnVuY3Rpb24gYXJlQ2hpbGROb2Rlc0NvbmdydWVudChjaGlsZE5vZGVzQSwgY2hpbGROb2Rlc0IpIHtcbiAgY29uc3QgY2hpbGROb2Rlc0NvbmdydWVudCA9IG1hdGNoKGNoaWxkTm9kZXNBLCBjaGlsZE5vZGVzQiwgKGNoaWxkTm9kZUEsIGNoaWxkTm9kZUIpID0+IHtcbiAgICBjb25zdCBjaGlsZE5vZGVDb25ncnVlbnQgPSBpc0NoaWxkTm9kZUNvbmdydWVudChjaGlsZE5vZGVBLCBjaGlsZE5vZGVCKTtcblxuICAgIGlmIChjaGlsZE5vZGVDb25ncnVlbnQpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSk7XG5cbiAgcmV0dXJuIGNoaWxkTm9kZXNDb25ncnVlbnQ7XG59XG5cbmZ1bmN0aW9uIGlzQ2hpbGROb2RlQ29uZ3J1ZW50KGNoaWxkTm9kZUEsIGNoaWxkTm9kZUIpIHtcbiAgbGV0IGNoaWxkTm9kZUNvbmdydWVudCA9IGZhbHNlO1xuXG4gIGNvbnN0IGNoaWxkTm9kZUFOb25UZXJtaW5hbE5vZGUgPSBjaGlsZE5vZGVBLmlzTm9uVGVybWluYWxOb2RlKCksXG4gICAgICAgIGNoaWxkTm9kZUJOb25UZXJtaW5hbE5vZGUgPSBjaGlsZE5vZGVCLmlzTm9uVGVybWluYWxOb2RlKCk7XG5cbiAgaWYgKGNoaWxkTm9kZUFOb25UZXJtaW5hbE5vZGUgJiYgY2hpbGROb2RlQk5vblRlcm1pbmFsTm9kZSkge1xuICAgIGNoaWxkTm9kZUNvbmdydWVudCA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY2hpbGROb2RlQVRlcm1pbmFsTm9kZSA9ICFjaGlsZE5vZGVBTm9uVGVybWluYWxOb2RlLFxuICAgICAgICAgIGNoaWxkTm9kZUJUZXJtaW5hbE5vZGUgPSAhY2hpbGROb2RlQk5vblRlcm1pbmFsTm9kZTtcblxuICAgIGlmIChjaGlsZE5vZGVBVGVybWluYWxOb2RlICYmIGNoaWxkTm9kZUJUZXJtaW5hbE5vZGUpIHtcbiAgICAgIGNvbnN0IHRlcm1pbmFsTm9kZUEgPSBjaGlsZE5vZGVBLCAvLy9cbiAgICAgICAgICAgIHRlcm1pbmFsTm9kZUIgPSBjaGlsZE5vZGVCLCAvLy9cbiAgICAgICAgICAgIHRlcm1pbmFsTm9kZUFNYXRjaGVzVGVybWluYWxOb2RlQiA9IHRlcm1pbmFsTm9kZUEubWF0Y2godGVybWluYWxOb2RlQik7XG5cbiAgICAgIGlmICh0ZXJtaW5hbE5vZGVBTWF0Y2hlc1Rlcm1pbmFsTm9kZUIpIHtcbiAgICAgICAgY2hpbGROb2RlQ29uZ3J1ZW50ID0gdHJ1ZTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gY2hpbGROb2RlQ29uZ3J1ZW50O1xufVxuIl0sIm5hbWVzIjpbImFyZUNoaWxkTm9kZXNDb25ncnVlbnQiLCJub25UZXJtaW5hbE5vZGVRdWVyeSIsIm1hdGNoIiwiYXJyYXlVdGlsaXRpZXMiLCJub2RlUXVlcnkiLCJjaGlsZE5vZGVzQSIsImNoaWxkTm9kZXNCIiwiY2hpbGROb2Rlc0NvbmdydWVudCIsImNoaWxkTm9kZUEiLCJjaGlsZE5vZGVCIiwiY2hpbGROb2RlQ29uZ3J1ZW50IiwiaXNDaGlsZE5vZGVDb25ncnVlbnQiLCJjaGlsZE5vZGVBTm9uVGVybWluYWxOb2RlIiwiaXNOb25UZXJtaW5hbE5vZGUiLCJjaGlsZE5vZGVCTm9uVGVybWluYWxOb2RlIiwiY2hpbGROb2RlQVRlcm1pbmFsTm9kZSIsImNoaWxkTm9kZUJUZXJtaW5hbE5vZGUiLCJ0ZXJtaW5hbE5vZGVBIiwidGVybWluYWxOb2RlQiIsInRlcm1pbmFsTm9kZUFNYXRjaGVzVGVybWluYWxOb2RlQiJdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7Ozs7Ozs7O1FBVWdCQTtlQUFBQTs7UUFGSEM7ZUFBQUE7OzsyQkFOa0I7dUJBRUw7QUFFMUIsTUFBTSxFQUFFQyxLQUFLLEVBQUUsR0FBR0MseUJBQWM7QUFFekIsTUFBTUYsdUJBQXVCRyxJQUFBQSxnQkFBUyxFQUFDO0FBRXZDLFNBQVNKLHVCQUF1QkssV0FBVyxFQUFFQyxXQUFXO0lBQzdELE1BQU1DLHNCQUFzQkwsTUFBTUcsYUFBYUMsYUFBYSxDQUFDRSxZQUFZQztRQUN2RSxNQUFNQyxxQkFBcUJDLHFCQUFxQkgsWUFBWUM7UUFFNUQsSUFBSUMsb0JBQW9CO1lBQ3RCLE9BQU87UUFDVDtJQUNGO0lBRUEsT0FBT0g7QUFDVDtBQUVBLFNBQVNJLHFCQUFxQkgsVUFBVSxFQUFFQyxVQUFVO0lBQ2xELElBQUlDLHFCQUFxQjtJQUV6QixNQUFNRSw0QkFBNEJKLFdBQVdLLGlCQUFpQixJQUN4REMsNEJBQTRCTCxXQUFXSSxpQkFBaUI7SUFFOUQsSUFBSUQsNkJBQTZCRSwyQkFBMkI7UUFDMURKLHFCQUFxQjtJQUN2QixPQUFPO1FBQ0wsTUFBTUsseUJBQXlCLENBQUNILDJCQUMxQkkseUJBQXlCLENBQUNGO1FBRWhDLElBQUlDLDBCQUEwQkMsd0JBQXdCO1lBQ3BELE1BQU1DLGdCQUFnQlQsWUFDaEJVLGdCQUFnQlQsWUFDaEJVLG9DQUFvQ0YsY0FBY2YsS0FBSyxDQUFDZ0I7WUFFOUQsSUFBSUMsbUNBQW1DO2dCQUNyQ1QscUJBQXFCO1lBQ3ZCO1FBQ0Y7SUFDRjtJQUVBLE9BQU9BO0FBQ1QifQ==
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "occam-languages",
3
3
  "author": "James Smith",
4
- "version": "0.0.208",
4
+ "version": "0.0.209",
5
5
  "license": "MIT, Anti-996",
6
6
  "homepage": "https://github.com/djalbat/occam-languages",
7
7
  "description": "Occam's common language functionality.",
@@ -9,64 +9,39 @@ const { match } = arrayUtilities;
9
9
  export const nonTerminalNodeQuery = nodeQuery("/*");
10
10
 
11
11
  export function areChildNodesCongruent(childNodesA, childNodesB) {
12
- let areChildNodesCongruent = false;
12
+ const childNodesCongruent = match(childNodesA, childNodesB, (childNodeA, childNodeB) => {
13
+ const childNodeCongruent = isChildNodeCongruent(childNodeA, childNodeB);
13
14
 
14
- const childNodesALength = childNodesA.length,
15
- childNodesBLength = childNodesB.length;
16
-
17
- if (childNodesALength === childNodesBLength) {
18
- const specificTerminalNodeMap = terminalNodeMapFromChildNodes(childNodesB),
19
- generalTerminalNodeMap = terminalNodeMapFromChildNodes(childNodesA),
20
- terminalNodeMapsEqual = areTerminalNodeMapsEqual(generalTerminalNodeMap, specificTerminalNodeMap);
21
-
22
- if (terminalNodeMapsEqual) {
23
- areChildNodesCongruent = true;
24
- }
25
- }
26
-
27
- return areChildNodesCongruent;
28
- }
29
-
30
- function terminalNodeMapFromChildNodes(childNodes) {
31
- const terminalNodeMap = {};
32
-
33
- childNodes.forEach((childNode, index) => {
34
- const childNodeTerminalNode = childNode.isTerminalNode();
35
-
36
- if (childNodeTerminalNode) {
37
- const terminalNode = childNode; //
38
-
39
- terminalNodeMap[index] = terminalNode;
15
+ if (childNodeCongruent) {
16
+ return true;
40
17
  }
41
18
  });
42
19
 
43
- return terminalNodeMap;
20
+ return childNodesCongruent;
44
21
  }
45
22
 
46
- function areTerminalNodeMapsEqual(generalTerminalNodeMap, specificTerminalNodeMap) {
47
- let terminalNodeMapsEqual = false;
23
+ function isChildNodeCongruent(childNodeA, childNodeB) {
24
+ let childNodeCongruent = false;
48
25
 
49
- const generalIndexes = Object.keys(generalTerminalNodeMap), ///
50
- specificIndexes = Object.keys(specificTerminalNodeMap), ///
51
- terminalNodeMapKeysMatch = match(generalIndexes, specificIndexes, (generalIndex, specificIndex) => {
52
- if (generalIndex === specificIndex) {
53
- return true;
54
- }
55
- });
26
+ const childNodeANonTerminalNode = childNodeA.isNonTerminalNode(),
27
+ childNodeBNonTerminalNode = childNodeB.isNonTerminalNode();
56
28
 
57
- if (terminalNodeMapKeysMatch) {
58
- const generalTerminalNodes = Object.values(generalTerminalNodeMap), ///
59
- specificTerminalNodes = Object.values(specificTerminalNodeMap), ///
60
- terminalNodeMapValuesMatch = match(generalTerminalNodes, specificTerminalNodes, (generalTerminalNode, specificTerminalNode) => {
61
- const generalTerminalNodeMatchesSpecificTerminalNode = generalTerminalNode.match(specificTerminalNode);
29
+ if (childNodeANonTerminalNode && childNodeBNonTerminalNode) {
30
+ childNodeCongruent = true;
31
+ } else {
32
+ const childNodeATerminalNode = !childNodeANonTerminalNode,
33
+ childNodeBTerminalNode = !childNodeBNonTerminalNode;
62
34
 
63
- if (generalTerminalNodeMatchesSpecificTerminalNode) {
64
- return true;
65
- }
66
- });
35
+ if (childNodeATerminalNode && childNodeBTerminalNode) {
36
+ const terminalNodeA = childNodeA, ///
37
+ terminalNodeB = childNodeB, ///
38
+ terminalNodeAMatchesTerminalNodeB = terminalNodeA.match(terminalNodeB);
67
39
 
68
- terminalNodeMapsEqual = terminalNodeMapValuesMatch; ///
40
+ if (terminalNodeAMatchesTerminalNodeB) {
41
+ childNodeCongruent = true;
42
+ }
43
+ }
69
44
  }
70
45
 
71
- return terminalNodeMapsEqual;
46
+ return childNodeCongruent;
72
47
  }