@rsconcept/domain 1.0.0 → 1.2.0

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.
Files changed (185) hide show
  1. package/README.md +3 -3
  2. package/dist/analyzer-DlSq3Y3r.d.ts +39 -0
  3. package/dist/arguments-extractor-1acwjQNc.d.ts +38 -0
  4. package/dist/ast-C8sIpKdL.d.ts +51 -0
  5. package/dist/ast-annotations-BiMjkKvz.d.ts +16 -0
  6. package/dist/branded-ZlzIcxzu.d.ts +9 -0
  7. package/dist/calculator-C9W2jkSx.d.ts +39 -0
  8. package/dist/cctext/index.d.ts +2 -1
  9. package/dist/cctext/index.js +2 -42
  10. package/dist/cctext/language-api.d.ts +10 -12
  11. package/dist/cctext/language-api.js +157 -227
  12. package/dist/cctext/language-api.js.map +1 -1
  13. package/dist/cctext/language.d.ts +24 -22
  14. package/dist/cctext/language.js +43 -39
  15. package/dist/cctext/language.js.map +1 -1
  16. package/dist/error-E1LVq_3w.d.ts +87 -0
  17. package/dist/graph/graph.d.ts +2 -62
  18. package/dist/graph/graph.js +339 -382
  19. package/dist/graph/graph.js.map +1 -1
  20. package/dist/graph/index.d.ts +2 -1
  21. package/dist/graph/index.js +2 -384
  22. package/dist/graph-DR8rL2o3.d.ts +64 -0
  23. package/dist/hash-Y8I4c6Al.d.ts +8 -0
  24. package/dist/index-BKZ67WMa.d.ts +1 -0
  25. package/dist/index-BVVgDSdq.d.ts +1 -0
  26. package/dist/index-DmtQKWjk.d.ts +1 -0
  27. package/dist/index-_6s0AX1B.d.ts +1 -0
  28. package/dist/index.d.ts +27 -28
  29. package/dist/index.js +23 -5851
  30. package/dist/lezer-tree-iS7LpLBJ.d.ts +14 -0
  31. package/dist/library/folder-tree.d.ts +22 -20
  32. package/dist/library/folder-tree.js +108 -130
  33. package/dist/library/folder-tree.js.map +1 -1
  34. package/dist/library/index.d.ts +8 -17
  35. package/dist/library/index.js +7 -2800
  36. package/dist/library/library-api.d.ts +3 -1
  37. package/dist/library/library-api.js +9 -8
  38. package/dist/library/library-api.js.map +1 -1
  39. package/dist/library/library.d.ts +2 -56
  40. package/dist/library/library.js +23 -19
  41. package/dist/library/library.js.map +1 -1
  42. package/dist/library/oss-api.d.ts +26 -37
  43. package/dist/library/oss-api.js +258 -1096
  44. package/dist/library/oss-api.js.map +1 -1
  45. package/dist/library/oss-layout-api.d.ts +28 -28
  46. package/dist/library/oss-layout-api.js +239 -316
  47. package/dist/library/oss-layout-api.js.map +1 -1
  48. package/dist/library/oss-layout.d.ts +2 -25
  49. package/dist/library/oss-layout.js +1 -1
  50. package/dist/library/oss.d.ts +87 -89
  51. package/dist/library/oss.js +27 -26
  52. package/dist/library/oss.js.map +1 -1
  53. package/dist/library/rsengine.d.ts +100 -106
  54. package/dist/library/rsengine.js +439 -2599
  55. package/dist/library/rsengine.js.map +1 -1
  56. package/dist/library/rsform-api.d.ts +11 -16
  57. package/dist/library/rsform-api.js +313 -825
  58. package/dist/library/rsform-api.js.map +1 -1
  59. package/dist/library/rsform.d.ts +159 -167
  60. package/dist/library/rsform.js +29 -28
  61. package/dist/library/rsform.js.map +1 -1
  62. package/dist/library/rsmodel-api.d.ts +8 -15
  63. package/dist/library/rsmodel-api.js +172 -813
  64. package/dist/library/rsmodel-api.js.map +1 -1
  65. package/dist/library/rsmodel.d.ts +27 -33
  66. package/dist/library/rsmodel.js +16 -23
  67. package/dist/library/rsmodel.js.map +1 -1
  68. package/dist/library/structure-planner.d.ts +20 -26
  69. package/dist/library/structure-planner.js +106 -474
  70. package/dist/library/structure-planner.js.map +1 -1
  71. package/dist/library-CYun28Xz.d.ts +58 -0
  72. package/dist/oss-layout-3glgAqfn.d.ts +27 -0
  73. package/dist/parser-Bwd8LxJ1.d.ts +7 -0
  74. package/dist/parsing/ast.d.ts +2 -49
  75. package/dist/parsing/ast.js +68 -76
  76. package/dist/parsing/ast.js.map +1 -1
  77. package/dist/parsing/index.d.ts +3 -3
  78. package/dist/parsing/index.js +3 -141
  79. package/dist/parsing/lezer-tree.d.ts +2 -13
  80. package/dist/parsing/lezer-tree.js +50 -43
  81. package/dist/parsing/lezer-tree.js.map +1 -1
  82. package/dist/rslang/api.d.ts +9 -14
  83. package/dist/rslang/api.js +114 -827
  84. package/dist/rslang/api.js.map +1 -1
  85. package/dist/rslang/ast-annotations.d.ts +2 -18
  86. package/dist/rslang/ast-annotations.js +34 -45
  87. package/dist/rslang/ast-annotations.js.map +1 -1
  88. package/dist/rslang/error.d.ts +2 -85
  89. package/dist/rslang/error.js +88 -150
  90. package/dist/rslang/error.js.map +1 -1
  91. package/dist/rslang/eval/calculator.d.ts +2 -43
  92. package/dist/rslang/eval/calculator.js +81 -1636
  93. package/dist/rslang/eval/calculator.js.map +1 -1
  94. package/dist/rslang/eval/evaluation-cache.d.ts +22 -26
  95. package/dist/rslang/eval/evaluation-cache.js +168 -287
  96. package/dist/rslang/eval/evaluation-cache.js.map +1 -1
  97. package/dist/rslang/eval/evaluator.d.ts +59 -63
  98. package/dist/rslang/eval/evaluator.js +602 -1509
  99. package/dist/rslang/eval/evaluator.js.map +1 -1
  100. package/dist/rslang/eval/value-api.d.ts +2 -48
  101. package/dist/rslang/eval/value-api.js +2 -490
  102. package/dist/rslang/eval/value.d.ts +2 -36
  103. package/dist/rslang/eval/value.js +2 -118
  104. package/dist/rslang/index.d.ts +14 -17
  105. package/dist/rslang/index.js +12 -4314
  106. package/dist/rslang/labels.d.ts +6 -6
  107. package/dist/rslang/labels.js +139 -305
  108. package/dist/rslang/labels.js.map +1 -1
  109. package/dist/rslang/parser/expression-generator.d.ts +5 -5
  110. package/dist/rslang/parser/expression-generator.js +248 -446
  111. package/dist/rslang/parser/expression-generator.js.map +1 -1
  112. package/dist/rslang/parser/normalize.d.ts +4 -8
  113. package/dist/rslang/parser/normalize.js +286 -481
  114. package/dist/rslang/parser/normalize.js.map +1 -1
  115. package/dist/rslang/parser/parser.d.ts +2 -5
  116. package/dist/rslang/parser/parser.js +30 -21
  117. package/dist/rslang/parser/parser.js.map +1 -1
  118. package/dist/rslang/parser/parser.terms.d.ts +43 -41
  119. package/dist/rslang/parser/parser.terms.js +44 -83
  120. package/dist/rslang/parser/parser.terms.js.map +1 -1
  121. package/dist/rslang/parser/syntax-errors.d.ts +5 -8
  122. package/dist/rslang/parser/syntax-errors.js +113 -382
  123. package/dist/rslang/parser/syntax-errors.js.map +1 -1
  124. package/dist/rslang/parser/token.d.ts +2 -79
  125. package/dist/rslang/parser/token.js +81 -93
  126. package/dist/rslang/parser/token.js.map +1 -1
  127. package/dist/rslang/semantic/analyzer.d.ts +2 -39
  128. package/dist/rslang/semantic/analyzer.js +186 -2600
  129. package/dist/rslang/semantic/analyzer.js.map +1 -1
  130. package/dist/rslang/semantic/arguments-extractor.d.ts +2 -42
  131. package/dist/rslang/semantic/arguments-extractor.js +202 -361
  132. package/dist/rslang/semantic/arguments-extractor.js.map +1 -1
  133. package/dist/rslang/semantic/type-auditor.d.ts +64 -68
  134. package/dist/rslang/semantic/type-auditor.js +594 -1564
  135. package/dist/rslang/semantic/type-auditor.js.map +1 -1
  136. package/dist/rslang/semantic/typification-api.d.ts +4 -7
  137. package/dist/rslang/semantic/typification-api.js +162 -303
  138. package/dist/rslang/semantic/typification-api.js.map +1 -1
  139. package/dist/rslang/semantic/typification-parser.d.ts +2 -12
  140. package/dist/rslang/semantic/typification-parser.js +165 -219
  141. package/dist/rslang/semantic/typification-parser.js.map +1 -1
  142. package/dist/rslang/semantic/typification.d.ts +2 -119
  143. package/dist/rslang/semantic/typification.js +66 -52
  144. package/dist/rslang/semantic/typification.js.map +1 -1
  145. package/dist/rslang/semantic/value-auditor.d.ts +32 -38
  146. package/dist/rslang/semantic/value-auditor.js +206 -518
  147. package/dist/rslang/semantic/value-auditor.js.map +1 -1
  148. package/dist/rslang/semantic/value-class.d.ts +2 -10
  149. package/dist/rslang/semantic/value-class.js +8 -7
  150. package/dist/rslang/semantic/value-class.js.map +1 -1
  151. package/dist/rslang/typification-graph.d.ts +2 -33
  152. package/dist/rslang/typification-graph.js +94 -306
  153. package/dist/rslang/typification-graph.js.map +1 -1
  154. package/dist/shared/branded.d.ts +2 -7
  155. package/dist/shared/branded.js +1 -1
  156. package/dist/shared/hash.d.ts +2 -6
  157. package/dist/shared/hash.js +13 -13
  158. package/dist/shared/hash.js.map +1 -1
  159. package/dist/shared/index.d.ts +3 -2
  160. package/dist/shared/index.js +2 -18
  161. package/dist/token-DeXAmzwr.d.ts +81 -0
  162. package/dist/typification-Dk-fisgO.d.ts +120 -0
  163. package/dist/typification-graph-6HcZ-rKH.d.ts +30 -0
  164. package/dist/typification-parser-BBVx1RxP.d.ts +13 -0
  165. package/dist/value-B8UtCqaK.js +366 -0
  166. package/dist/value-B8UtCqaK.js.map +1 -0
  167. package/dist/value-CTjX6825.d.ts +33 -0
  168. package/dist/value-api-Bw-SgaYY.d.ts +49 -0
  169. package/dist/value-class-CNI-lqXJ.d.ts +12 -0
  170. package/package.json +8 -8
  171. package/src/library/oss-api.test.ts +76 -0
  172. package/src/library/oss-api.ts +4 -1
  173. package/src/library/rsform-api.test.ts +24 -0
  174. package/src/library/rsform-api.ts +12 -4
  175. package/dist/cctext/index.js.map +0 -1
  176. package/dist/graph/index.js.map +0 -1
  177. package/dist/index.js.map +0 -1
  178. package/dist/library/index.js.map +0 -1
  179. package/dist/library/oss-layout.js.map +0 -1
  180. package/dist/parsing/index.js.map +0 -1
  181. package/dist/rslang/eval/value-api.js.map +0 -1
  182. package/dist/rslang/eval/value.js.map +0 -1
  183. package/dist/rslang/index.js.map +0 -1
  184. package/dist/shared/branded.js.map +0 -1
  185. package/dist/shared/index.js.map +0 -1
package/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../src/cctext/language.ts","../src/graph/graph.ts","../src/library/folder-tree.ts","../src/library/library.ts","../src/library/oss.ts","../src/rslang/ast-annotations.ts","../src/rslang/error.ts","../src/parsing/ast.ts","../src/parsing/lezer-tree.ts","../src/rslang/parser/token.ts","../src/rslang/eval/evaluation-cache.ts","../src/shared/hash.ts","../src/rslang/semantic/typification.ts","../src/rslang/eval/value-api.ts","../src/rslang/eval/value.ts","../src/rslang/eval/evaluator.ts","../src/rslang/eval/calculator.ts","../src/rslang/parser/parser.ts","../src/rslang/parser/parser.terms.ts","../src/rslang/parser/normalize.ts","../src/rslang/parser/syntax-errors.ts","../src/rslang/labels.ts","../src/rslang/semantic/typification-api.ts","../src/rslang/semantic/type-auditor.ts","../src/rslang/semantic/value-class.ts","../src/rslang/semantic/value-auditor.ts","../src/rslang/semantic/analyzer.ts","../src/rslang/semantic/typification-parser.ts","../src/rslang/typification-graph.ts","../src/library/rsform.ts","../src/library/rsform-api.ts","../src/library/rsmodel.ts","../src/library/rsmodel-api.ts","../src/library/rsengine.ts"],"sourcesContent":["/**\n * Module: Natural language model declarations.\n */\n\n/** Represents single unit of language Morphology. */\n// prettier-ignore\nexport const Grammeme = {\n // Число\n sing: 'sing', plur: 'plur',\n\n // Падеж\n nomn: 'nomn', gent: 'gent', datv: 'datv',\n accs: 'accs', ablt: 'ablt', loct: 'loct',\n} as const;\nexport type Grammeme = (typeof Grammeme)[keyof typeof Grammeme];\n\n/** Represents case language concept. */\nexport const Case: Grammeme[] = [\n Grammeme.nomn,\n Grammeme.gent,\n Grammeme.datv,\n Grammeme.accs,\n Grammeme.ablt,\n Grammeme.loct\n] as const;\n\n/** Represents plurality language concept. */\nexport const Plurality: Grammeme[] = [Grammeme.sing, Grammeme.plur] as const;\n\n/** Represents specific wordform attached to {@link Grammeme}s. */\nexport interface WordForm {\n text: string;\n grams: Grammeme[];\n}\n\n/** Represents a term available for text reference resolution. */\nexport interface TermContextItem {\n nominal: string;\n forms?: WordForm[];\n}\n\n/** Represents term lookup context keyed by entity alias. */\nexport type TermContext = Record<string, TermContextItem>;\n\n/**\n * Represents list of {@link Grammeme}s available in reference construction.\n */\n// prettier-ignore\nexport const supportedGrammemes = [\n Grammeme.sing, Grammeme.plur,\n Grammeme.nomn, Grammeme.gent, Grammeme.datv,\n Grammeme.accs, Grammeme.ablt, Grammeme.loct,\n] as const;\n\n// ====== Reference resolution =====\n\n/** Represents text reference type. */\nexport const ReferenceType = {\n ENTITY: 'entity',\n SYNTACTIC: 'syntax'\n} as const;\nexport type ReferenceType = (typeof ReferenceType)[keyof typeof ReferenceType];\n\n/** Represents entity reference payload. */\nexport interface EntityReference {\n entity: string;\n tags: Grammeme[];\n}\n\n/** Represents syntactic reference payload. */\nexport interface SyntacticReference {\n offset: number;\n nominal: string;\n}\n\n/** Represents abstract reference data. */\nexport interface IReference {\n type: ReferenceType;\n data: EntityReference | SyntacticReference;\n}\n","/**\n * Module: Custom graph data structure.\n */\n\n/** Represents single node of a {@link Graph}, as implemented by storing outgoing and incoming connections. */\nexport class GraphNode<NodeID> {\n /** Unique identifier of the node. */\n id: NodeID;\n /** List of outgoing nodes. */\n outputs: NodeID[];\n /** List of incoming nodes. */\n inputs: NodeID[];\n\n constructor(id: NodeID) {\n this.id = id;\n this.outputs = [];\n this.inputs = [];\n }\n\n clone(): GraphNode<NodeID> {\n const result = new GraphNode(this.id);\n result.outputs = [...this.outputs];\n result.inputs = [...this.inputs];\n return result;\n }\n\n addOutput(node: NodeID): void {\n this.outputs.push(node);\n }\n\n addInput(node: NodeID): void {\n this.inputs.push(node);\n }\n\n removeInput(target: NodeID): NodeID | null {\n const index = this.inputs.findIndex(node => node === target);\n return index > -1 ? this.inputs.splice(index, 1)[0] : null;\n }\n\n removeOutput(target: NodeID): NodeID | null {\n const index = this.outputs.findIndex(node => node === target);\n return index > -1 ? this.outputs.splice(index, 1)[0] : null;\n }\n}\n\n/**\n * Represents a Graph.\n *\n * This class is optimized for TermGraph use case and not supposed to be used as generic graph implementation.\n */\nexport class Graph<NodeID = number> {\n /** Map of nodes. */\n nodes = new Map<NodeID, GraphNode<NodeID>>();\n\n constructor(arr?: NodeID[][]) {\n if (!arr) {\n return;\n }\n arr.forEach(edge => {\n if (edge.length === 1) {\n this.addNode(edge[0]);\n } else {\n this.addEdge(edge[0], edge[1]);\n }\n });\n }\n\n clone(): Graph<NodeID> {\n const result = new Graph<NodeID>();\n this.nodes.forEach(node => result.nodes.set(node.id, node.clone()));\n return result;\n }\n\n at(target: NodeID): GraphNode<NodeID> | undefined {\n return this.nodes.get(target);\n }\n\n addNode(target: NodeID): GraphNode<NodeID> {\n let node = this.nodes.get(target);\n if (!node) {\n node = new GraphNode(target);\n this.nodes.set(target, node);\n }\n return node;\n }\n\n hasNode(target: NodeID): boolean {\n return !!this.nodes.get(target);\n }\n\n removeNode(target: NodeID): void {\n this.nodes.forEach(node => {\n node.removeInput(target);\n node.removeOutput(target);\n });\n this.nodes.delete(target);\n }\n\n foldNode(target: NodeID): void {\n const nodeToRemove = this.nodes.get(target);\n if (!nodeToRemove) {\n return;\n }\n nodeToRemove.inputs.forEach(input => {\n nodeToRemove.outputs.forEach(output => {\n this.addEdge(input, output);\n });\n });\n this.removeNode(target);\n }\n\n removeIsolated(): GraphNode<NodeID>[] {\n const result: GraphNode<NodeID>[] = [];\n this.nodes.forEach(node => {\n if (node.outputs.length === 0 && node.inputs.length === 0) {\n result.push(node);\n this.nodes.delete(node.id);\n }\n });\n return result;\n }\n\n addEdge(source: NodeID, destination: NodeID): void {\n if (this.hasEdge(source, destination)) {\n return;\n }\n const sourceNode = this.addNode(source);\n const destinationNode = this.addNode(destination);\n sourceNode.addOutput(destinationNode.id);\n destinationNode.addInput(sourceNode.id);\n }\n\n removeEdge(source: NodeID, destination: NodeID): void {\n const sourceNode = this.nodes.get(source);\n const destinationNode = this.nodes.get(destination);\n if (sourceNode && destinationNode) {\n sourceNode.removeOutput(destination);\n destinationNode.removeInput(source);\n }\n }\n\n hasEdge(source: NodeID, destination: NodeID): boolean {\n const sourceNode = this.nodes.get(source);\n if (!sourceNode) {\n return false;\n }\n return !!sourceNode.outputs.find(id => id === destination);\n }\n\n isReachable(source: NodeID, destination: NodeID): boolean {\n return this.expandAllOutputs([source]).includes(destination);\n }\n\n rootNodes(): NodeID[] {\n return [...this.nodes.keys()].filter(id => !this.nodes.get(id)?.inputs.length);\n }\n\n expandOutputs(origin: NodeID[]): NodeID[] {\n const result: NodeID[] = [];\n origin.forEach(id => {\n const node = this.nodes.get(id);\n if (node) {\n node.outputs.forEach(child => {\n if (!origin.includes(child) && !result.includes(child)) {\n result.push(child);\n }\n });\n }\n });\n return result;\n }\n\n expandInputs(origin: NodeID[]): NodeID[] {\n const result: NodeID[] = [];\n origin.forEach(id => {\n const node = this.nodes.get(id);\n if (node) {\n node.inputs.forEach(child => {\n if (!origin.includes(child) && !result.includes(child)) {\n result.push(child);\n }\n });\n }\n });\n return result;\n }\n\n expandAllOutputs(origin: NodeID[]): NodeID[] {\n const result: NodeID[] = this.expandOutputs(origin);\n if (result.length === 0) {\n return [];\n }\n\n const marked = new Map<NodeID, boolean>();\n origin.forEach(id => marked.set(id, true));\n let position = 0;\n while (position < result.length) {\n const node = this.nodes.get(result[position]);\n if (node && !marked.get(node.id)) {\n marked.set(node.id, true);\n node.outputs.forEach(child => {\n if (!marked.get(child) && !result.find(id => id === child)) {\n result.push(child);\n }\n });\n }\n position += 1;\n }\n return result;\n }\n\n expandAllInputs(origin: NodeID[]): NodeID[] {\n const result: NodeID[] = this.expandInputs(origin);\n if (result.length === 0) {\n return [];\n }\n\n const marked = new Map<NodeID, boolean>();\n origin.forEach(id => marked.set(id, true));\n let position = 0;\n while (position < result.length) {\n const node = this.nodes.get(result[position]);\n if (node && !marked.get(node.id)) {\n marked.set(node.id, true);\n node.inputs.forEach(child => {\n if (!marked.get(child) && !result.find(id => id === child)) {\n result.push(child);\n }\n });\n }\n position += 1;\n }\n return result;\n }\n\n maximizePart(origin: NodeID[]): NodeID[] {\n const outputs: NodeID[] = this.expandAllOutputs(origin);\n const result = [...origin];\n this.topologicalOrder()\n .filter(id => outputs.includes(id))\n .forEach(id => {\n const node = this.nodes.get(id);\n if (node?.inputs.every(parent => result.includes(parent))) {\n result.push(id);\n }\n });\n return result;\n }\n\n topologicalOrder(): NodeID[] {\n const result: NodeID[] = [];\n const marked = new Set<NodeID>();\n const nodeStack: NodeID[] = [];\n this.nodes.forEach(node => {\n if (marked.has(node.id)) {\n return;\n }\n nodeStack.push(node.id);\n while (nodeStack.length > 0) {\n const item = nodeStack[nodeStack.length - 1];\n if (marked.has(item)) {\n if (!result.find(id => id === item)) {\n result.push(item);\n }\n nodeStack.pop();\n } else {\n marked.add(item);\n const itemNode = this.nodes.get(item);\n if (itemNode && itemNode.outputs.length > 0) {\n itemNode.outputs.forEach(child => {\n if (!marked.has(child)) {\n nodeStack.push(child);\n }\n });\n }\n }\n }\n });\n return result.reverse();\n }\n\n /**\n * Stably reorders the given node ids so that, for this DAG, no node appears before a transitive\n * successor (edges: source → dependent; {@link GraphNode.outputs} lists dependents).\n */\n sortStable(target: NodeID[]): NodeID[] {\n if (target.length <= 1) {\n return [...target];\n }\n\n const reachable = this.buildTransitiveClosureForSort();\n const testSet = new Set<NodeID>();\n const result: NodeID[] = [];\n\n for (const nodeId of [...target].reverse()) {\n const nodeReachable = reachable.get(nodeId) ?? new Set<NodeID>();\n const needMove = testSet.has(nodeId);\n for (const childId of nodeReachable) {\n testSet.add(childId);\n }\n\n if (!needMove) {\n result.push(nodeId);\n continue;\n }\n\n let inserted = false;\n for (let index = 0; index < result.length; index++) {\n const parent = result[index];\n const parentReachable = reachable.get(parent) ?? new Set<NodeID>();\n if (nodeReachable.has(parent)) {\n if (parentReachable.has(nodeId)) {\n result.push(nodeId);\n } else {\n result.splice(index, 0, nodeId);\n }\n inserted = true;\n break;\n }\n }\n if (!inserted) {\n result.push(nodeId);\n }\n }\n\n result.reverse();\n return result;\n }\n\n private buildTransitiveClosureForSort(): Map<NodeID, Set<NodeID>> {\n const closure = new Map<NodeID, Set<NodeID>>();\n for (const node of this.nodes.values()) {\n closure.set(node.id, new Set(node.outputs));\n }\n\n const order = this.topologicalOrder();\n for (const nodeId of [...order].reverse()) {\n const node = this.at(nodeId);\n if (!node) {\n continue;\n }\n const nodeClosure = closure.get(nodeId) ?? new Set<NodeID>();\n for (const parentId of node.inputs) {\n const parentClosure = closure.get(parentId) ?? new Set<NodeID>();\n for (const childId of nodeClosure) {\n parentClosure.add(childId);\n }\n closure.set(parentId, parentClosure);\n }\n }\n\n return closure;\n }\n\n transitiveReduction() {\n const order = this.topologicalOrder();\n const marked = new Map<NodeID, boolean>();\n order.forEach(nodeID => {\n if (marked.get(nodeID)) {\n return;\n }\n const stack: { id: NodeID; parents: NodeID[] }[] = [];\n stack.push({ id: nodeID, parents: [] });\n while (stack.length > 0) {\n const item = stack.splice(0, 1)[0];\n const node = this.nodes.get(item.id);\n if (node) {\n node.outputs.forEach(child => {\n item.parents.forEach(parent => this.removeEdge(parent, child));\n stack.push({ id: child, parents: [item.id, ...item.parents] });\n });\n }\n marked.set(item.id, true);\n }\n });\n }\n\n /**\n * Finds a cycle in the graph.\n *\n * @returns {NodeID[] | null} The cycle if found, otherwise `null`.\n * Uses non-recursive DFS.\n */\n findCycle(): NodeID[] | null {\n const visited = new Set<NodeID>();\n const nodeStack = new Set<NodeID>();\n const parents = new Map<NodeID, NodeID>();\n\n for (const nodeId of this.nodes.keys()) {\n if (visited.has(nodeId)) {\n continue;\n }\n\n const callStack: { nodeId: NodeID; parentId: NodeID | null }[] = [];\n callStack.push({ nodeId: nodeId, parentId: null });\n while (callStack.length > 0) {\n const { nodeId, parentId } = callStack[callStack.length - 1];\n if (visited.has(nodeId)) {\n nodeStack.delete(nodeId);\n callStack.pop();\n continue;\n }\n visited.add(nodeId);\n nodeStack.add(nodeId);\n if (parentId !== null) {\n parents.set(nodeId, parentId);\n }\n\n const currentNode = this.nodes.get(nodeId)!;\n for (const child of currentNode.outputs) {\n if (!visited.has(child)) {\n callStack.push({ nodeId: child, parentId: nodeId });\n continue;\n }\n if (!nodeStack.has(child)) {\n continue;\n }\n const cycle: NodeID[] = [];\n let current = nodeId;\n cycle.push(child);\n while (current !== child) {\n cycle.push(current);\n current = parents.get(current)!;\n }\n cycle.push(child);\n cycle.reverse();\n return cycle;\n }\n }\n }\n return null;\n }\n}\n","/**\n * Module: Folder tree data structure. Does not support deletions.\n */\n\n/**\n * Represents single node of a {@link FolderTree}.\n */\nexport class FolderNode {\n rank: number = 0;\n text: string;\n children: Map<string, FolderNode>;\n parent: FolderNode | null;\n\n filesInside: number = 0;\n filesTotal: number = 0;\n\n constructor(text: string, parent: FolderNode | null = null) {\n this.text = text;\n this.parent = parent;\n this.children = new Map();\n if (parent) {\n this.rank = parent.rank + 1;\n }\n }\n\n addChild(text: string): FolderNode {\n const node = new FolderNode(text, this);\n this.children.set(text, node);\n return node;\n }\n\n hasPredecessor(target: FolderNode): boolean {\n if (this.parent === target) {\n return true;\n } else if (!this.parent) {\n return false;\n }\n let node = this.parent;\n while (node.parent) {\n if (node.parent === target) {\n return true;\n }\n node = node.parent;\n }\n return false;\n }\n\n incrementFiles(count: number = 1): void {\n this.filesInside = this.filesInside + count;\n this.incrementTotal(count);\n }\n\n incrementTotal(count: number = 1): void {\n this.filesTotal = this.filesTotal + count;\n if (this.parent) {\n this.parent.incrementTotal(count);\n }\n }\n\n getPath(): string {\n const suffix = this.text ? `/${this.text}` : '';\n if (!this.parent) {\n return suffix;\n } else {\n return this.parent.getPath() + suffix;\n }\n }\n}\n\n/** Represents a FolderTree. */\nexport class FolderTree {\n roots = new Map<string, FolderNode>();\n\n constructor(arr?: string[]) {\n arr?.forEach(path => this.addPath(path));\n }\n\n at(path: string): FolderNode | undefined {\n let parse = ChopPathHead(path);\n if (!this.roots.has(parse.head)) {\n return undefined;\n }\n let node = this.roots.get(parse.head)!;\n while (parse.tail !== '') {\n parse = ChopPathHead(parse.tail);\n if (!node.children.has(parse.head)) {\n return undefined;\n }\n node = node.children.get(parse.head)!;\n }\n return node;\n }\n\n getTree(): FolderNode[] {\n const result: FolderNode[] = [];\n this.roots.forEach(root => this.visitNode(root, result));\n return result;\n }\n\n private visitNode(target: FolderNode, result: FolderNode[]) {\n result.push(target);\n [...target.children.keys()]\n .sort((a, b) => a.localeCompare(b))\n .forEach(key => this.visitNode(target.children.get(key)!, result));\n }\n\n addPath(path: string, filesCount: number = 1): FolderNode {\n let parse = ChopPathHead(path);\n if (!parse.head) {\n throw Error(`Invalid path ${path}`);\n }\n let node = this.roots.has(parse.head) ? this.roots.get(parse.head)! : this.addNode(parse.head);\n while (parse.tail !== '') {\n parse = ChopPathHead(parse.tail);\n if (node.children.has(parse.head)) {\n node = node.children.get(parse.head)!;\n } else {\n node = this.addNode(parse.head, node);\n }\n }\n node.incrementFiles(filesCount);\n return node;\n }\n\n private addNode(text: string, parent?: FolderNode): FolderNode {\n if (!parent) {\n const newNode = new FolderNode(text);\n this.roots.set(text, newNode);\n return newNode;\n } else {\n return parent.addChild(text);\n }\n }\n}\n\n// ========= Internals =======\nfunction ChopPathHead(path: string) {\n if (path?.at(0) !== '/') {\n return {\n head: '',\n tail: ''\n };\n }\n const slash = path.indexOf('/', 1);\n if (slash === -1) {\n return {\n head: path.substring(1),\n tail: ''\n };\n } else {\n return {\n head: path.substring(1, slash),\n tail: path.substring(slash)\n };\n }\n}\n","/**\n * Module: Models for LibraryItem.\n */\n\n/** Represents type of library items. */\nexport const LibraryItemType = {\n RSFORM: 'rsform',\n OSS: 'oss',\n RSMODEL: 'rsmodel'\n} as const;\nexport type LibraryItemType = (typeof LibraryItemType)[keyof typeof LibraryItemType];\n\n/** Represents Access policy for library items.*/\nexport const AccessPolicy = {\n PUBLIC: 'public',\n PROTECTED: 'protected',\n PRIVATE: 'private'\n} as const;\nexport type AccessPolicy = (typeof AccessPolicy)[keyof typeof AccessPolicy];\n\n/** Represents valid location headers. */\nexport const LocationHead = {\n USER: '/U',\n COMMON: '/S',\n LIBRARY: '/L',\n PROJECTS: '/P'\n} as const;\nexport type LocationHead = (typeof LocationHead)[keyof typeof LocationHead];\n\n/** Represents {@link LibraryItem} minimal reference data. */\nexport interface LibraryItemReference {\n id: number;\n alias: string;\n}\n\n/** Represents library item common data typical for all item types. */\nexport interface LibraryItem {\n id: number;\n item_type: LibraryItemType;\n alias: string;\n title: string;\n description: string;\n visible: boolean;\n read_only: boolean;\n location: string;\n access_policy: AccessPolicy;\n time_create: string;\n time_update: string;\n owner: number | null;\n}\n\n/** Represents library item version information. */\nexport interface VersionInfo {\n id: number;\n version: string;\n description: string;\n time_create: string;\n}\n\n/** Represents current version */\nexport type CurrentVersion = number | 'latest';\n","/**\n * Module: Schema of Synthesis Operations.\n */\n\nimport { type Graph } from '../graph';\n\nimport { type LibraryItem } from './library';\nimport { type NodePosition, type OssLayout } from './oss-layout';\n\n/** Represents OSS node type. */\nexport const NodeType = {\n OPERATION: 1,\n BLOCK: 2\n} as const;\nexport type NodeType = (typeof NodeType)[keyof typeof NodeType];\n\n/** Represents OSS graph node. */\ninterface OssNode extends NodePosition {\n nodeType: NodeType;\n parent: number | null;\n}\n\n/** Represents {@link Operation} type. */\nexport const OperationType = {\n INPUT: 'input',\n SYNTHESIS: 'synthesis',\n REPLICA: 'replica'\n} as const;\nexport type OperationType = (typeof OperationType)[keyof typeof OperationType];\n\n/** Represents {@link Substitution} extended data. */\nexport interface CstSubstituteInfo {\n original: number;\n substitution: number;\n operation: number;\n original_schema: number;\n original_alias: string;\n original_term: string;\n substitution_schema: number;\n substitution_alias: string;\n substitution_term: string;\n}\n\n/** Represents Operation common attributes. */\ninterface OperationBase extends OssNode {\n id: number;\n alias: string;\n title: string;\n description: string;\n operation_type: OperationType;\n result: number | null;\n nodeType: typeof NodeType.OPERATION;\n has_additions: boolean;\n}\n\n/** Represents Input Operation. */\nexport interface OperationInput extends OperationBase {\n operation_type: typeof OperationType.INPUT;\n is_import: boolean;\n}\n\n/** Represents Replica Operation. */\ninterface OperationReplica extends OperationBase {\n operation_type: typeof OperationType.REPLICA;\n target: number;\n}\n\n/** Represents Synthesis Operation. */\nexport interface OperationSynthesis extends OperationBase {\n operation_type: typeof OperationType.SYNTHESIS;\n is_consolidation: boolean; // aka 'diamond synthesis'\n substitutions: CstSubstituteInfo[];\n arguments: number[];\n}\n\n/** Represents Operation. */\nexport type Operation = OperationInput | OperationReplica | OperationSynthesis;\n\n/** Represents Block. */\nexport interface Block extends OssNode {\n id: number;\n oss: number;\n title: string;\n description: string;\n parent: number | null;\n nodeType: typeof NodeType.BLOCK;\n}\n\n/** Represents item of OperationSchema. */\nexport type OssItem = Operation | Block;\n\n/** Represents {@link OperationSchema} statistics. */\nexport interface OperationSchemaStats {\n count_all: number;\n count_inputs: number;\n count_synthesis: number;\n count_schemas: number;\n count_owned: number;\n count_block: number;\n count_references: number;\n}\n\n/** Represents OperationSchema. */\nexport interface OperationSchema extends LibraryItem {\n editors: number[];\n operations: Operation[];\n blocks: Block[];\n replicas: {\n original: number;\n replica: number;\n }[];\n layout: OssLayout;\n arguments: {\n operation: number;\n argument: number;\n }[];\n substitutions: CstSubstituteInfo[];\n\n graph: Graph;\n extendedGraph: Graph;\n hierarchy: Graph<string>;\n schemas: number[];\n stats: OperationSchemaStats;\n operationByID: Map<number, Operation>;\n blockByID: Map<number, Block>;\n itemByNodeID: Map<string, OssItem>;\n}\n\n/** Represents substitution error description. */\nexport interface SubstitutionErrorDescription {\n errorType: SubstitutionErrorType;\n params: string[];\n}\n\n/** Represents Substitution table error types. */\nexport const SubstitutionErrorType = {\n invalidIDs: 0,\n incorrectCst: 1,\n invalidClasses: 2,\n invalidBasic: 3,\n invalidConstant: 4,\n typificationCycle: 5,\n baseSubstitutionNotSet: 6,\n unequalTypification: 7,\n unequalExpressions: 8,\n unequalArgsCount: 9,\n unequalArgs: 10,\n invalidNominal: 11\n} as const;\nexport type SubstitutionErrorType = (typeof SubstitutionErrorType)[keyof typeof SubstitutionErrorType];\n","/** Module: AST annotations. */\n\nimport { type AstNode } from '../parsing';\n\nimport { type ExpressionType } from './semantic/typification';\nimport { type RSErrorCode, type RSErrorInfo } from './error';\n\nconst AST_ERRORS_KEY = 'rsErrors' as const;\nconst AST_TYPE_KEY = 'rsType' as const;\n\n/** Appends {@link ExpressionType} onto the node's `annotation.rsType`. */\nexport function annotateType(node: AstNode, type: ExpressionType): void {\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_TYPE_KEY]: type\n };\n}\n\n/** Reads {@link ExpressionType} from node's `annotation`. */\nexport function readTypeAnnotation(node: AstNode): ExpressionType | null {\n if (node.annotation && AST_TYPE_KEY in node.annotation) {\n return node.annotation[AST_TYPE_KEY] as ExpressionType;\n }\n return null;\n}\n\n/** Appends {@link RSErrorInfo} onto the node's `annotation.rsErrors` if not already set. */\nexport function annotateError(node: AstNode, code: RSErrorCode, params?: readonly string[]): void {\n if (\n typeof node.annotation === 'object' &&\n node.annotation !== null &&\n AST_ERRORS_KEY in node.annotation &&\n isAstNodeErrorRef(node.annotation[AST_ERRORS_KEY])\n ) {\n return;\n }\n const entry: RSErrorInfo = params !== undefined && params.length > 0 ? { code, params: [...params] } : { code };\n node.annotation = {\n ...(typeof node.annotation === 'object' && node.annotation !== null ? node.annotation : {}),\n [AST_ERRORS_KEY]: entry\n };\n}\n\n/** Reads validated {@link RSErrorInfo} entry from node's `annotation`. */\nexport function readErrorAnnotation(node: AstNode): RSErrorInfo | null {\n const raw = node.annotation?.[AST_ERRORS_KEY];\n if (isAstNodeErrorRef(raw)) {\n return raw;\n }\n return null;\n}\n\n// ====== Internal ======\nfunction isAstNodeErrorRef(x: unknown): x is RSErrorInfo {\n if (typeof x !== 'object' || x === null || !('code' in x)) {\n return false;\n }\n const code = x.code;\n if (typeof code !== 'number') {\n return false;\n }\n if (!('params' in x)) {\n return true;\n }\n const p = (x as { params: unknown }).params;\n if (p === undefined) {\n return true;\n }\n return Array.isArray(p) && p.every(item => typeof item === 'string');\n}\n","/** Module: Error types and functions. */\n\n/** Represents error class. */\nexport const RSErrorClass = {\n LEXER: 0,\n PARSER: 1,\n SEMANTIC: 2,\n EVALUATION: 3,\n UNKNOWN: 4\n} as const;\nexport type RSErrorClass = (typeof RSErrorClass)[keyof typeof RSErrorClass];\n\n/** Represents RSLang expression error information. */\nexport interface RSErrorInfo {\n code: RSErrorCode;\n params?: readonly string[];\n}\n\n/** Represents RSLang expression error description. */\nexport interface RSErrorDescription extends RSErrorInfo {\n from: number;\n to: number;\n}\n\n/** Error reporter function type. */\nexport type ErrorReporter = (error: RSErrorDescription) => void;\n\n/** Represents RSLang expression error types. */\nexport const RSErrorCode = {\n unknownSyntax: 0x8400, // 33792\n missingParenthesis: 0x8406, // 33798\n missingCurlyBrace: 0x8407, // 33799\n missingSquareBracket: 0x8408, // 33800\n bracketMismatch: 0x8409, // 33801\n doubleParenthesis: 0x840a, // 33802\n missingOpenBracket: 0x840b, // 33803\n expectedLocal: 0x8415, // 33813\n expectedType: 0x8416, // 33814\n\n localDoubleDeclare: 0x2801, // 10241\n localNotUsed: 0x2802, // 10242\n\n localUndeclared: 0x8801, // 34817\n localShadowing: 0x8802, // 34818\n\n typesNotEqual: 0x8803, // 34819\n globalNotTyped: 0x8804, // 34820\n invalidDecart: 0x8805, // 34821\n invalidBoolean: 0x8806, // 34822\n invalidTypeOperation: 0x8807, // 34823\n invalidCard: 0x8808, // 34824\n invalidDebool: 0x8809, // 34825\n globalFuncWithoutArgs: 0x880b, // 34827\n invalidReduce: 0x8810, // 34832\n invalidProjectionTuple: 0x8811, // 34833\n invalidProjectionSet: 0x8812, // 34834\n invalidEnumeration: 0x8813, // 34835\n invalidCortegeDeclare: 0x8814, // 34836\n localOutOfScope: 0x8815, // 34837\n invalidElementPredicate: 0x8816, // 34838\n invalidEmptySetUsage: 0x8817, // 34839\n invalidArgsArity: 0x8818, // 34840\n invalidArgumentType: 0x8819, // 34841\n globalStructure: 0x881c, // 34844\n radicalUsage: 0x8821, // 34849\n invalidFilterArgumentType: 0x8822, // 34850\n invalidFilterArity: 0x8823, // 34851\n arithmeticNotSupported: 0x8824, // 34852\n typesNotCompatible: 0x8825, // 34853\n orderingNotSupported: 0x8826, // 34854\n expectedLogic: 0x8827, // 34855\n expectedSetexpr: 0x8828, // 34856\n invalidArgumentCortegeDeclare: 0x8829, // 34857\n\n globalNoValue: 0x8840, // 34880\n invalidPropertyUsage: 0x8841, // 34881\n\n // Value evaluation (runtime)\n calcUnknownError: 0x8100, // 35328\n setOverflow: 0x8101, // 35329\n booleanBaseLimit: 0x8102, // 35330\n calcGlobalMissing: 0x8103, // 35331\n iterationsLimit: 0x8104, // 35332\n calcInvalidDebool: 0x8105, // 35333\n iterateInfinity: 0x8106, // 35334\n calculationNotSupported: 0x8107, // 35335\n\n cstEmptyDerived: 0x8861, // 34913\n definitionNotAllowed: 0x8862 // 34914\n} as const;\nexport type RSErrorCode = (typeof RSErrorCode)[keyof typeof RSErrorCode];\n\nconst ERROR_EVALUATION_MASK = 0x0100;\nconst ERROR_LEXER_MASK = 0x0200;\nconst ERROR_PARSER_MASK = 0x0400;\nconst ERROR_SEMANTIC_MASK = 0x0800;\n\n/** Infers error class from error type (code). */\nfunction inferErrorClass(error: RSErrorCode): RSErrorClass {\n if ((error & ERROR_EVALUATION_MASK) !== 0) {\n return RSErrorClass.EVALUATION;\n } else if ((error & ERROR_LEXER_MASK) !== 0) {\n return RSErrorClass.LEXER;\n } else if ((error & ERROR_PARSER_MASK) !== 0) {\n return RSErrorClass.PARSER;\n } else if ((error & ERROR_SEMANTIC_MASK) !== 0) {\n return RSErrorClass.SEMANTIC;\n } else {\n return RSErrorClass.UNKNOWN;\n }\n}\n\n/** Generate ErrorID label. */\nexport function getRSErrorPrefix(code: RSErrorCode): string {\n const id = code.toString(16).toUpperCase();\n // prettier-ignore\n switch (inferErrorClass(code)) {\n case RSErrorClass.LEXER: return 'L' + id;\n case RSErrorClass.PARSER: return 'P' + id;\n case RSErrorClass.SEMANTIC: return 'S' + id;\n case RSErrorClass.EVALUATION: return 'E' + id;\n case RSErrorClass.UNKNOWN: return 'U' + id;\n }\n}\n\n/** Checks if error is critical. */\nexport function isCritical(code: RSErrorCode): boolean {\n return code !== RSErrorCode.localDoubleDeclare && code !== RSErrorCode.localNotUsed;\n}\n","import { type TreeCursor } from './lezer-tree';\n\nexport const TOKEN_ERROR = 0;\n\n/** Represents AST node data. */\ninterface AstNodeData extends Record<string, unknown> {\n dataType: string;\n value: unknown;\n}\n\n/** Represents AST structured node base. */\nexport interface AstNodeBase {\n typeID: number;\n data: AstNodeData;\n annotation?: Record<string, unknown>;\n}\n\n/** Represents AST structured node. */\nexport interface AstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n from: number;\n to: number;\n hasError: boolean;\n parenthesis?: boolean;\n parent: AstNode | null;\n children: AstNode[];\n}\n\n/** Represents AST node. */\nexport interface FlatAstNode extends Record<string, unknown>, AstNodeBase {\n uid: number;\n parent: number | null;\n from: number;\n to: number;\n}\n\n/** Represents Syntax tree flat representation. */\nexport type FlatAST = FlatAstNode[];\n\n/** Builds AST tree from a given tree cursor, generating unique uids for each node. */\nexport function buildTree(cursor: TreeCursor): AstNode {\n let nextUid = 1;\n function genUid() {\n return nextUid++;\n }\n return buildTreeInternal(cursor, null, genUid);\n}\n\n/** Flattens AST tree to a array form. */\nexport function flattenAst(node: AstNode, parent: number | null = null, out: FlatAST = []): FlatAST {\n out.push({\n uid: node.uid,\n parent: parent,\n typeID: node.typeID,\n from: node.from,\n to: node.to,\n data: node.data,\n annotation: node.annotation\n });\n for (const child of node.children) {\n flattenAst(child, node.uid, out);\n }\n return out;\n}\n\n/** Visits AST tree in depth-first order. */\nexport function visitAstDFS(node: AstNode, callback: (node: AstNode) => void) {\n for (const child of node.children) {\n visitAstDFS(child, callback);\n }\n callback(node);\n}\n\n/** Finds and returns the AstNode with the given ui. */\nexport function findByUid(root: AstNode, uid: number): AstNode | null {\n let found: AstNode | null = null;\n visitAstDFS(root, node => {\n if (node.uid === uid && !found) {\n found = node;\n }\n });\n return found;\n}\n\n/** Prints AST tree. */\nexport function printAst(node: AstNode, printNode: (node: AstNode) => string): string {\n let children: string = '';\n for (const child of node.children) {\n children += `${printAst(child, printNode)}`;\n }\n return `[${printNode(node)}${children}]`;\n}\n\n/** Extracts node text. */\nexport function getNodeText(node: AstNode): string {\n if (node.data.dataType === 'string' && typeof node.data.value === 'string') {\n return node.data.value;\n }\n return `NO DATA NODE: ${node.typeID}`;\n}\n\n/** Extracts node indices. */\nexport function getNodeIndices(node: AstNode): number[] {\n if (node.data.dataType === 'string[]' && Array.isArray(node.data.value)) {\n return (node.data.value as string[]).map(s => parseInt(s, 10)).filter(n => !isNaN(n));\n }\n return [];\n}\n\n// ======== Internals ========\nfunction buildTreeInternal(cursor: TreeCursor, parent: AstNode | null = null, genUid: () => number): AstNode {\n const node = cursor.node;\n\n const result: AstNode = {\n uid: genUid(),\n typeID: node.type.isError ? 0 : node.type.id,\n from: node.from,\n to: node.to,\n hasError: node.type.isError,\n data: node.type.isError ? { dataType: 'null', value: null } : { dataType: 'string', value: node.type.name },\n parent,\n children: []\n };\n\n if (cursor.firstChild()) {\n do {\n const child = buildTreeInternal(cursor, result, genUid);\n if (child.hasError) {\n result.hasError = true;\n }\n result.children.push(child);\n } while (cursor.nextSibling());\n cursor.parent();\n }\n return result;\n}\n","import { type NodeType, type Tree, type TreeCursor } from '@lezer/common';\nexport { type TreeCursor } from '@lezer/common';\n\n/** Represents syntax tree node data. */\nexport interface CMSyntaxNode {\n type: NodeType;\n from: number;\n to: number;\n}\n\n/** Prints tree to compact string. */\nexport function printTree(tree: Tree): string {\n const state = {\n output: '',\n prefixes: [] as string[]\n };\n traverseTree(tree, {\n onEnter: node => {\n state.output += '[';\n state.output += node.type.name;\n },\n onLeave: () => {\n state.output += ']';\n }\n });\n return state.output;\n}\n\n// ======== Internals ========\n\ninterface CursorNode extends CMSyntaxNode {\n isLeaf: boolean;\n}\n\nfunction cursorNode({ type, from, to }: TreeCursor, isLeaf = false): CursorNode {\n return { type, from, to, isLeaf };\n}\n\ninterface TreeTraversalOptions {\n beforeEnter?: (cursor: TreeCursor) => void;\n onEnter: (node: CursorNode) => false | void;\n onLeave?: (node: CursorNode) => false | void;\n}\n\n/** Implements depth-first traversal. */\nfunction traverseTree(tree: Tree, { beforeEnter, onEnter, onLeave }: TreeTraversalOptions) {\n const cursor = tree.cursor();\n for (;;) {\n let node = cursorNode(cursor);\n let leave = false;\n const enter = !node.type.isAnonymous;\n if (enter && beforeEnter) beforeEnter(cursor);\n node.isLeaf = !cursor.firstChild();\n if (enter) {\n leave = true;\n if (onEnter(node) === false) return;\n }\n if (!node.isLeaf) continue;\n for (;;) {\n node = cursorNode(cursor, node.isLeaf);\n if (leave && onLeave) if (onLeave(node) === false) return;\n leave = cursor.type.isAnonymous;\n node.isLeaf = false;\n if (cursor.nextSibling()) break;\n if (!cursor.parent()) return;\n leave = true;\n }\n }\n}\n","import { TOKEN_ERROR } from '../../parsing';\n\n/** Represents RSLang token types. */\nexport const TokenID = {\n // Global, local IDs and literals\n ERROR: TOKEN_ERROR,\n\n ID_LOCAL: 258,\n ID_GLOBAL: 259,\n ID_FUNCTION: 260,\n ID_PREDICATE: 261,\n ID_RADICAL: 262,\n LIT_INTEGER: 263,\n LIT_WHOLE_NUMBERS: 264,\n LIT_EMPTYSET: 265,\n\n // Arithmetic\n PLUS: 266,\n MINUS: 267,\n MULTIPLY: 268,\n\n // Integer predicate symbols\n GREATER: 269,\n LESSER: 270,\n GREATER_OR_EQ: 271,\n LESSER_OR_EQ: 272,\n\n // Equality comparison\n EQUAL: 273,\n NOTEQUAL: 274,\n\n // Logic predicate symbols\n QUANTOR_UNIVERSAL: 275,\n QUANTOR_EXISTS: 276,\n LOGIC_NOT: 277,\n LOGIC_EQUIVALENT: 278,\n LOGIC_IMPLICATION: 279,\n LOGIC_OR: 280,\n LOGIC_AND: 281,\n\n // Set theory predicate symbols\n SET_IN: 282,\n SET_NOT_IN: 283,\n SUBSET: 284,\n SUBSET_OR_EQ: 285,\n NOT_SUBSET: 286,\n\n // Set theory operators\n DECART: 287,\n SET_UNION: 288,\n SET_INTERSECTION: 289,\n SET_MINUS: 290,\n SET_SYMMETRIC_MINUS: 291,\n BOOLEAN: 292,\n\n // Structure operations\n BIGPR: 293,\n SMALLPR: 294,\n FILTER: 295,\n CARD: 296,\n BOOL: 297,\n DEBOOL: 298,\n REDUCE: 299,\n\n // Term constructions prefixes\n DECLARATIVE: 300,\n RECURSIVE: 301,\n IMPERATIVE: 302,\n\n ITERATE: 303,\n ASSIGN: 304,\n\n // Punctuation\n PUNCTUATION_DEFINE: 305,\n PUNCTUATION_STRUCT: 306,\n PUNCTUATION_PL: 307,\n PUNCTUATION_PR: 308,\n PUNCTUATION_CL: 309,\n PUNCTUATION_CR: 310,\n PUNCTUATION_SL: 311,\n PUNCTUATION_SR: 312,\n PUNCTUATION_BAR: 313,\n PUNCTUATION_COMMA: 314,\n PUNCTUATION_SEMICOLON: 315,\n\n // ======= Non-terminal tokens =========\n NT_ENUM_DECL: 316,\n NT_TUPLE: 317,\n NT_ENUMERATION: 318,\n NT_TUPLE_DECL: 319,\n NT_ARG_DECL: 320,\n\n NT_FUNC_DEFINITION: 321,\n NT_ARGUMENTS: 322,\n NT_FUNC_CALL: 323,\n\n NT_DECLARATIVE_EXPR: 324,\n NT_IMPERATIVE_EXPR: 325,\n NT_RECURSIVE_FULL: 326,\n NT_RECURSIVE_SHORT: 327,\n\n // ======= Helper tokens ========\n INTERRUPT: 328,\n END: 329\n} as const;\nexport type TokenID = (typeof TokenID)[keyof typeof TokenID];\n","/**\n * Module: Dependency metadata and per-run memoization for RSLang evaluation.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { TokenID } from '../parser/token';\n\nimport { type Value } from './value';\n\n/** Static metadata for one AST node. */\nexport interface EvalNodeInfo {\n /** Local aliases this expression reads (for dependency stamping). */\n reads: ReadonlySet<string>;\n /** Stable key shared by structurally equivalent expressions. */\n structuralKey: string;\n /** Whether the node may be memoized for the current evaluation run. */\n cacheable: boolean;\n}\n\n/** Per-evaluator cache of immutable AST dependency metadata (no runtime values). */\nexport class EvaluationMetadata {\n private readonly byNode = new WeakMap<AstNode, EvalNodeInfo>();\n\n get(node: AstNode): EvalNodeInfo {\n let info = this.byNode.get(node);\n if (!info) {\n info = analyzeNode(node, new Set());\n this.byNode.set(node, info);\n }\n return info;\n }\n}\n\n/** Per-run memo of computed values (cleared on each {@link Evaluator.run}). */\nexport class EvaluationCache {\n private entries = new Map<string, CacheEntry>();\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n hits = 0;\n\n /** Returns cached value, or `undefined` on miss or stamp mismatch. */\n lookup(structuralKey: string, stamp: string): Value | undefined {\n const entry = this.entries.get(structuralKey);\n if (entry?.stamp !== stamp) {\n return undefined;\n }\n this.hits++;\n return entry.value;\n }\n\n /** Stores one value per structural key (replaces previous stamp). */\n store(structuralKey: string, stamp: string, value: Value): void {\n this.entries.set(structuralKey, { stamp, value });\n }\n\n clear(): void {\n this.entries.clear();\n this.hits = 0;\n }\n}\n\ninterface CacheEntry {\n stamp: string;\n value: Value;\n}\n\nfunction analyzeNode(node: AstNode, bound: Set<string>): EvalNodeInfo {\n const reads = collectReads(node, bound);\n const structuralKey = buildStructuralKey(node);\n const cacheable = isCacheableNode(node);\n return { reads, structuralKey, cacheable };\n}\n\nfunction isCacheableNode(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.ASSIGN:\n case TokenID.ITERATE:\n case TokenID.NT_IMPERATIVE_EXPR:\n case TokenID.NT_DECLARATIVE_EXPR:\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.NT_FUNC_DEFINITION:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.ID_GLOBAL:\n return false;\n default:\n return !node.hasError;\n }\n}\n\nfunction buildStructuralKey(node: AstNode): string {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n return `${node.typeID}:${nodeTextKey(node)}`;\n\n case TokenID.NT_FUNC_CALL:\n return `${node.typeID}:${nodeTextKey(node.children[0])}(${node.children\n .slice(1)\n .map(buildStructuralKey)\n .join(',')})`;\n\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.FILTER:\n return `${node.typeID}:${indicesKey(node)}(${node.children.map(buildStructuralKey).join(',')})`;\n\n default:\n return `${node.typeID}(${node.children.map(buildStructuralKey).join(',')})`;\n }\n}\n\nfunction nodeTextKey(node: AstNode): string {\n if (node.data.dataType === 'number') {\n return String(node.data.value);\n }\n return getNodeText(node);\n}\n\nfunction indicesKey(node: AstNode): string {\n return getNodeIndices(node).join('.');\n}\n\nfunction collectReads(node: AstNode, bound: Set<string>): Set<string> {\n const reads = new Set<string>();\n collectReadsImpl(node, bound, reads);\n return reads;\n}\n\nfunction collectReadsImpl(node: AstNode, bound: Set<string>, reads: Set<string>): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL: {\n reads.add(getNodeText(node));\n return;\n }\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.NT_DECLARATIVE_EXPR: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[2], innerBound, reads);\n return;\n }\n\n case TokenID.ITERATE: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.ASSIGN: {\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n case TokenID.NT_IMPERATIVE_EXPR: {\n const innerBound = new Set(bound);\n collectReadsImpl(node.children[0], innerBound, reads);\n for (let i = 1; i < node.children.length; i++) {\n const child = node.children[i];\n if (child.typeID === TokenID.ITERATE) {\n extendBoundInPlace(innerBound, child.children[0]);\n collectReadsImpl(child.children[1], innerBound, reads);\n } else if (child.typeID === TokenID.ASSIGN) {\n collectReadsImpl(child.children[1], innerBound, reads);\n extendBoundInPlace(innerBound, child.children[0]);\n } else {\n collectReadsImpl(child, innerBound, reads);\n }\n }\n return;\n }\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT: {\n collectReadsImpl(node.children[1], bound, reads);\n const innerBound = extendBound(bound, node.children[0]);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n collectReadsImpl(node.children[2], innerBound, reads);\n collectReadsImpl(node.children[3], innerBound, reads);\n } else {\n collectReadsImpl(node.children[2], innerBound, reads);\n }\n return;\n }\n\n case TokenID.NT_FUNC_DEFINITION: {\n const innerBound = extendBound(bound, node.children[0]);\n collectReadsImpl(node.children[1], innerBound, reads);\n return;\n }\n\n case TokenID.NT_FUNC_CALL: {\n for (let i = 1; i < node.children.length; i++) {\n collectReadsImpl(node.children[i], bound, reads);\n }\n return;\n }\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION: {\n collectReadsImpl(node.children[0], bound, reads);\n collectReadsImpl(node.children[1], bound, reads);\n return;\n }\n\n default:\n for (const child of node.children) {\n collectReadsImpl(child, bound, reads);\n }\n }\n}\n\nfunction extendBound(bound: Set<string>, declNode: AstNode): Set<string> {\n const next = new Set(bound);\n extendBoundInPlace(next, declNode);\n return next;\n}\n\nfunction extendBoundInPlace(bound: Set<string>, declNode: AstNode): void {\n switch (declNode.typeID) {\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n bound.add(getNodeText(declNode));\n break;\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n for (const child of declNode.children) {\n extendBoundInPlace(bound, child);\n }\n break;\n case TokenID.NT_ARG_DECL:\n extendBoundInPlace(bound, declNode.children[0]);\n break;\n }\n}\n","/** 32-bit FNV-1a hash */\nexport function applyHash_fnv1a(str: string): number {\n let hash = 0x811c9dc5;\n\n for (let i = 0; i < str.length; i++) {\n hash ^= str.charCodeAt(i);\n hash = Math.imul(hash, 0x01000193);\n }\n\n return hash >>> 0;\n}\n\n/** Generates stub ID for text. */\nexport function generateStub(text: string): string {\n const hash = applyHash_fnv1a(text);\n return hash.toString(16).padStart(8, '0').slice(0, 8);\n}\n","/*\n * Module: Typification for RSLang.\n */\n\nimport { type Branded } from '../../shared';\n\n/** Typification structure enumeration. */\nexport const TypeID = {\n anyTypification: 1,\n integer: 2,\n basic: 3,\n tuple: 4,\n collection: 5,\n logic: 6,\n function: 7,\n predicate: 8\n} as const;\nexport type TypeID = (typeof TypeID)[keyof typeof TypeID];\n\n/** Represents type class. */\nexport const TypeClass = {\n logic: 1,\n typification: 2,\n function: 3,\n predicate: 4\n} as const;\nexport type TypeClass = (typeof TypeClass)[keyof typeof TypeClass];\n\n/** Logic type object. */\nexport const LogicT = { typeID: TypeID.logic } as const;\n\n/** Integer type object. */\nexport const IntegerT = {\n typeID: TypeID.integer,\n isOrdered: true,\n isArithmetic: true,\n isIntegerCompatible: true\n} as const;\n\n/** Type transformation path. */\nexport type TypePath = Branded<number[], 'TypePath'>;\n\n/** Creates type path. */\nexport function makeTypePath(path: number[]): TypePath {\n return path as TypePath;\n}\n\n/** AnyTyped type object. */\nexport const AnyTypificationT = { typeID: TypeID.anyTypification } as const;\n\n/** Empty set typification. */\nexport const EmptySetT = bool(AnyTypificationT);\n\n/** Parametrized typification. */\nexport type Parametrized = EchelonFunctional | EchelonPredicate;\n\n/** General expression types. */\nexport type ExpressionType =\n | EchelonLogic\n | EchelonBase\n | EchelonTuple\n | EchelonCollection\n | EchelonFunctional\n | EchelonPredicate\n | EchelonAnyTyped\n | EchelonInteger;\n\n/** Setexpr type. */\nexport type Typification = EchelonBase | EchelonAnyTyped | EchelonInteger | EchelonCollection | EchelonTuple;\n\n/** Typification context. */\nexport type TypeContext = Map<string, ExpressionType>;\n\n/** Functional argument. */\nexport interface Argument {\n readonly alias: string;\n readonly type: Typification;\n}\n\n/** Type: Logic. */\nexport interface EchelonLogic {\n readonly typeID: typeof TypeID.logic;\n}\n\n/** Type: AnyTyped. */\nexport interface EchelonAnyTyped {\n readonly typeID: typeof TypeID.anyTypification;\n}\n\n/** Type: Integer. */\nexport interface EchelonInteger {\n readonly typeID: typeof TypeID.integer;\n readonly isOrdered: true;\n readonly isArithmetic: true;\n readonly isIntegerCompatible: true;\n}\n\n/** Type: Element of basic set. */\nexport interface EchelonBase {\n readonly typeID: typeof TypeID.basic;\n readonly baseID: string;\n readonly isOrdered?: boolean;\n readonly isArithmetic?: boolean;\n readonly isIntegerCompatible?: boolean;\n}\n\n/** Type: Tuple. */\nexport interface EchelonTuple {\n readonly typeID: typeof TypeID.tuple;\n readonly factors: readonly Typification[];\n}\n\n/** Type: Collection. */\nexport interface EchelonCollection {\n readonly typeID: typeof TypeID.collection;\n readonly base: Typification;\n}\n\n/** Type: Functional. */\nexport interface EchelonFunctional {\n readonly typeID: typeof TypeID.function;\n readonly result: Typification;\n readonly args: readonly Argument[];\n}\n\n/** Type: Predicate. */\nexport interface EchelonPredicate {\n readonly typeID: typeof TypeID.predicate;\n readonly result: EchelonLogic;\n readonly args: readonly Argument[];\n}\n\n/** Create basic element typification. */\nexport function basic(alias: string): EchelonBase {\n return { typeID: TypeID.basic, baseID: alias };\n}\n\n/** Create constant element typification. */\nexport function constant(alias: string): EchelonBase {\n return { typeID: TypeID.basic, baseID: alias, isOrdered: true, isArithmetic: true, isIntegerCompatible: true };\n}\n\n/** Create boolean typification. */\nexport function bool(base: Typification): EchelonCollection {\n return { typeID: TypeID.collection, base };\n}\n\n/** Create tuple typification. */\nexport function tuple(factors: Typification[]): EchelonTuple {\n if (factors.length < 2) {\n throw new Error('Tuple with less than two factors is not allowed');\n }\n return { typeID: TypeID.tuple, factors };\n}\n\n/** Remove boolean from typification. */\nexport function debool(target: EchelonCollection): Typification {\n return target.base;\n}\n\n/** Extract component from tuple. */\nexport function component(target: EchelonTuple, index: number): Typification | null {\n return target.factors[index - 1] ?? null;\n}\n\n/** Checks if given type is typification. */\nexport function isTypification(type: ExpressionType | null): boolean {\n return (\n type?.typeID === TypeID.basic ||\n type?.typeID === TypeID.anyTypification ||\n type?.typeID === TypeID.integer ||\n type?.typeID === TypeID.collection ||\n type?.typeID === TypeID.tuple\n );\n}\n\n/** Checks if given type is radical. */\nexport function isRadical(alias: string): boolean {\n return alias.length > 0 && alias.startsWith('R') && alias[1] !== '0';\n}\n","import { generateStub } from '../../shared';\nimport { type ExpressionType, TypeID, type TypePath, type Typification } from '../semantic/typification';\n\nimport {\n BOOL_INFINITY,\n compare,\n EmptySetV,\n INVALID_ELEMENT,\n makeValuePath,\n set,\n SET_INFINITY,\n tuple,\n TUPLE_ID,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext,\n type ValuePath\n} from './value';\n\n/** Cartesian product of factor sets. */\nexport function cartesianProduct(factors: Value[][]): Value[] | null {\n const cardinality = factors.reduce((acc, f) => acc * f.length, 1);\n if (cardinality > SET_INFINITY) {\n return null;\n }\n if (cardinality === 0 || factors.length === 0) {\n return EmptySetV;\n }\n\n let accumulator: Value[][] = [[]];\n for (const factor of factors) {\n const next: Value[][] = [];\n for (const prefix of accumulator) {\n for (const value of factor) {\n next.push([...prefix, value]);\n }\n }\n accumulator = next;\n }\n return accumulator.map(tuple);\n}\n\n/** Boolean power set ℬ(X). No cache - materialized. */\nexport function boolean(base: Value[]): Value[] | null {\n if (base.length > BOOL_INFINITY) {\n return null;\n }\n return powerset(base);\n}\n\n/** Powerset of array. */\nfunction powerset(arr: readonly Value[]): Value[][] {\n const result: Value[][] = [[]];\n if (arr.length === 0) {\n return result;\n }\n\n let current: Value[][] = [[]];\n let maxIndex: number[] = [-1];\n while (current.length > 0) {\n const next: Value[][] = [];\n const nextMaxIndex: number[] = [];\n for (let i = 0; i < current.length; i++) {\n for (let j = maxIndex[i] + 1; j < arr.length; j++) {\n const subset = [...current[i], arr[j]];\n result.push(subset);\n if (j < arr.length - 1) {\n next.push(subset);\n nextMaxIndex.push(j);\n }\n }\n }\n current = next;\n maxIndex = nextMaxIndex;\n }\n return result;\n}\n\n/** Check if set contains element. */\nexport function contains(setData: Value[], element: Value): boolean {\n let left = 0;\n let right = setData.length - 1;\n while (left <= right) {\n const mid = Math.floor((left + right) / 2);\n const cmp = compare(setData[mid], element);\n if (cmp === 0) {\n return true;\n } else if (cmp < 0) {\n left = mid + 1;\n } else {\n right = mid - 1;\n }\n }\n return false;\n}\n\n/** Is A ⊆ B. */\nexport function isSubsetOrEq(a: Value[], b: Value[]): boolean {\n let i = 0,\n j = 0;\n while (i < a.length && j < b.length) {\n const cmp = compare(a[i], b[j]);\n if (cmp === 0) {\n i++;\n j++;\n } else if (cmp > 0) {\n j++;\n } else {\n return false;\n }\n }\n return i === a.length;\n}\n\n/** Reduce: flatten double boolean to single boolean. */\nexport function reduce(target: Value[][]): Value[] {\n const result: Value[] = [];\n for (const element of target) {\n result.push(...element);\n }\n return set(result);\n}\n\n/** Union A ∪ B. */\nexport function setUnion(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Intersection A ∩ B. */\nexport function setIntersection(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n for (let i = 0, j = 0; i < set1.length && j < set2.length; ) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n result.push(set1[i]);\n i++;\n j++;\n }\n }\n return result;\n}\n\n/** Difference A \\ B. */\nexport function setDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n return result;\n}\n\n/** Symmetric difference A ∆ B. */\nexport function setSymDiff(set1: Value[], set2: Value[]): Value[] {\n const result: Value[] = [];\n let i = 0,\n j = 0;\n while (i < set1.length && j < set2.length) {\n const cmp = compare(set1[i], set2[j]);\n if (cmp < 0) {\n result.push(set1[i]);\n i++;\n } else if (cmp > 0) {\n result.push(set2[j]);\n j++;\n } else {\n i++;\n j++;\n }\n }\n while (i < set1.length) {\n result.push(set1[i]);\n i++;\n }\n while (j < set2.length) {\n result.push(set2[j]);\n j++;\n }\n return result;\n}\n\n/** Projection of set by indices (BigPr). */\nexport function projection(target: Value[][], indices: number[]): Value[] {\n const projectedElements: Value[] = target.map(element => {\n const newComponents = indices.map(idx => element[idx]);\n return indices.length === 1 ? newComponents[0] : tuple(newComponents);\n });\n return set(projectedElements);\n}\n\n/** Condensed string representation. */\nexport function printValue(data: Value | null): string {\n if (!Array.isArray(data)) {\n return String(data);\n }\n const len = data.length;\n if (data.length === 0) {\n return '{}';\n }\n\n const isTuple = data[0] === TUPLE_ID;\n const start = isTuple ? 1 : 0;\n\n let result = isTuple ? '(' : '{';\n for (let i = start; i < len; i++) {\n if (i > start) result += ', ';\n result += printValue(data[i]);\n }\n result += isTuple ? ')' : '}';\n return result;\n}\n\n/** Generates stub ID for value. */\nexport function valueStub(value: Value | null): string {\n if (value == null) {\n return '';\n }\n const str = printValue(value);\n return generateStub(str);\n}\n\n/** Checks if value is a set representation, not a tuple representation. */\nexport function isSetValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && (data.length === 0 || data[0] !== TUPLE_ID);\n}\n\n/** Checks if value is a tuple representation. */\nexport function isTupleValue(data: Value | null): data is Value[] {\n return Array.isArray(data) && data.length > 1 && data[0] === TUPLE_ID;\n}\n\n/** Normalize unsorted array of values. */\nexport function normalizeValue(data: Value): void {\n if (!Array.isArray(data) || data.length === 0) {\n return;\n }\n\n if (data[0] === TUPLE_ID) {\n for (let i = 1; i < data.length; i++) {\n normalizeValue(data[i]);\n }\n return;\n }\n\n for (const item of data) {\n normalizeValue(item);\n }\n\n data.sort((a, b) => compare(a, b));\n let i = 1;\n while (i < data.length) {\n if (compare(data[i - 1], data[i]) === 0) {\n data.splice(i, 1);\n } else {\n i++;\n }\n }\n}\n\n/** Validates value for {@link ExpressionType} and value of basic sets. */\nexport function validateValue(value: Value, type: ExpressionType, basics: ValueContext): boolean {\n switch (type.typeID) {\n case TypeID.integer:\n return typeof value === 'number';\n case TypeID.logic: {\n if (typeof value !== 'number') {\n return false;\n }\n return value === VALUE_TRUE || value === VALUE_FALSE;\n }\n case TypeID.basic: {\n if (typeof value !== 'number') {\n return false;\n }\n const domain = basics.get(type.baseID);\n return !!domain && Array.isArray(domain) && domain.includes(value);\n }\n\n case TypeID.tuple: {\n if (!Array.isArray(value) || value.length !== type.factors.length + 1 || value[0] !== TUPLE_ID) {\n return false;\n }\n for (let i = 0; i < type.factors.length; i++) {\n if (!validateValue(value[i + 1], type.factors[i], basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.collection: {\n if (!isSetValue(value)) {\n return false;\n }\n for (const item of value) {\n if (!validateValue(item, type.base, basics)) {\n return false;\n }\n }\n return true;\n }\n\n case TypeID.anyTypification:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Converts value path to type path. */\nexport function convertPathToType(path: ValuePath, type: Typification): TypePath | null {\n const result: number[] = [];\n if (path.length === 0) {\n return result as TypePath;\n }\n\n let curType = type;\n let index = 0;\n while (index < path.length) {\n switch (curType.typeID) {\n case TypeID.collection: {\n result.push(0);\n curType = curType.base;\n index++;\n break;\n }\n case TypeID.tuple: {\n const tupleIdx = path[index];\n if (typeof tupleIdx !== 'number' || tupleIdx < 1 || tupleIdx > curType.factors.length) {\n return null;\n }\n result.push(tupleIdx);\n curType = curType.factors[tupleIdx - 1];\n index++;\n break;\n }\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return null;\n }\n }\n return result as TypePath;\n}\n\n/** Extracts value from a target by path. */\nexport function extractValue(target: Value, path: ValuePath): Value | null {\n let current: Value = target;\n let i = 0;\n while (i < path.length) {\n if (!Array.isArray(current) || current.length <= path[i]) {\n return null;\n }\n current = current[path[i]];\n i++;\n }\n return current;\n}\n\n/** Makes default value for a type. */\nexport function makeDefaultValue(type: Typification): Value {\n switch (type.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return INVALID_ELEMENT;\n case TypeID.collection:\n return [];\n case TypeID.tuple:\n return tuple(type.factors.map(item => makeDefaultValue(item)));\n }\n}\n\n/** Perform immutable deep copy update. */\nexport function setNestedValue(target: Value | null, path: ValuePath, newVal: Value): Value {\n if (path.length === 0) {\n return newVal;\n }\n const [head, ...rest] = path;\n const arr = Array.isArray(target) ? [...target] : [];\n arr[head] = setNestedValue(arr[head], makeValuePath(rest), newVal);\n return arr;\n}\n\n/** Test if value contains invalid elements. */\nexport function testInvalid(value: Value): boolean {\n const stack = [value];\n while (stack.length > 0) {\n const current = stack.pop();\n if (current === INVALID_ELEMENT) {\n return true;\n }\n if (Array.isArray(current)) {\n for (const element of current) {\n stack.push(element);\n }\n }\n }\n return false;\n}\n","/**\n * Module: Structured data for RSLang expression evaluation.\n */\n\nimport { type Branded } from '../../shared';\n\nimport { printValue } from './value-api';\n\n/** Tuple ID for array distinction. */\nexport const TUPLE_ID = -111;\n\n/** Invalid value for structured data. */\nexport const INVALID_ELEMENT = -1;\n\n/** Boolean values: true. */\nexport const VALUE_TRUE = 1;\n\n/** Boolean values: false. */\nexport const VALUE_FALSE = 0;\n\n/** Cardinality threshold for \"infinite\" sets (e.g. Z). */\nexport const SET_INFINITY = 10_000_000;\n\n/** Cardinality threshold for Boolean power set. */\nexport const BOOL_INFINITY = 18;\n\n/** Expression evaluation result: structured data. */\nexport type Value = number | Value[];\n\n/** Values context. */\nexport type ValueContext = Map<string, Value>;\n\n/** Value extraction path. */\nexport type ValuePath = Branded<number[], 'ValuePath'>;\n\n/** Creates value path. */\nexport function makeValuePath(path: number[]): ValuePath {\n return path as ValuePath;\n}\n\n/** Empty set ∅. */\nexport const EmptySetV = [];\n\n/** Compare two structured data without recursive calls. */\nexport function compare(v1: Value, v2: Value): number {\n const stack1: Value[] = [v1];\n const stack2: Value[] = [v2];\n\n while (stack1.length > 0 && stack2.length > 0) {\n const el1 = stack1.pop();\n const el2 = stack2.pop();\n if (el1 === el2) {\n continue;\n }\n\n const type1 = typeof el1;\n const type2 = typeof el2;\n if (type1 === 'number' && type2 === 'number') {\n const numDiff = (el1 as number) - (el2 as number);\n if (numDiff !== 0) return numDiff;\n continue;\n }\n\n const isArray1 = Array.isArray(el1);\n const isArray2 = Array.isArray(el2);\n if (!isArray1 || !isArray2) {\n throw new Error(`Cannot compare different types ${printValue(el1!)} and ${printValue(el2!)}`);\n }\n\n const arr1 = el1;\n const arr2 = el2;\n const len1 = arr1.length;\n const len2 = arr2.length;\n if (len1 !== len2) {\n return len1 - len2;\n }\n\n for (let i = len1 - 1; i >= 0; i--) {\n stack1.push(arr1[i]);\n stack2.push(arr2[i]);\n }\n }\n return 0;\n}\n\n/** Tuple from components. */\nexport function tuple(components: Value[]): Value {\n return [TUPLE_ID, ...components];\n}\n\n/** Set from elements (unique). Value[] - materialized. */\nexport function set(elements: Value[]): Value[] {\n const sorted = [...elements].sort(compare);\n for (let i = 1; i < sorted.length; ) {\n if (compare(sorted[i - 1], sorted[i]) === 0) {\n sorted.splice(i, 1);\n } else {\n i++;\n }\n }\n return sorted;\n}\n","/**\n * Module: AST evaluation - visitor-pattern evaluator for RS expressions.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { TokenID } from '../parser/token';\n\nimport { EvaluationCache, EvaluationMetadata } from './evaluation-cache';\nimport {\n BOOL_INFINITY,\n compare,\n EmptySetV,\n set,\n SET_INFINITY,\n tuple,\n type Value,\n VALUE_FALSE,\n VALUE_TRUE,\n type ValueContext\n} from './value';\nimport {\n boolean,\n cartesianProduct,\n contains,\n isSubsetOrEq,\n projection,\n reduce,\n setDiff,\n setIntersection,\n setSymDiff,\n setUnion\n} from './value-api';\n\n/** Maximum iterations to prevent infinite loops (recursion, quantifiers, etc.). */\nconst MAX_ITERATIONS = 1_000_000;\n\nconst TICK_PER_FUNCTION = 3;\nconst TICK_PER_RECURSION = 3;\nconst TICK_PER_IMPERATIVE = 1;\nconst TICK_PER_DECLARATIVE = 1;\nconst TICK_PER_QUANTIFIER = 1;\n\n/** AST context. */\nexport type ASTContext = Map<string, AstNode>;\n\n/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners.\n * Not safe for concurrent {@link run} calls on the same instance; use separate evaluators instead. */\nexport class Evaluator {\n private reporter?: ErrorReporter;\n private annotateErrors = false;\n private disableCache = false;\n private locals: LocalContext = new LocalContext();\n private nodeMetadata: EvaluationMetadata = new EvaluationMetadata();\n private evalCache: EvaluationCache = new EvaluationCache();\n private callSiteStack: AstNode[] = [];\n private context: ValueContext;\n private treeContext: ASTContext;\n\n public iterationCounter = 0;\n\n /** Cache hits in the current evaluation run (for tests/diagnostics). */\n public get cacheHits(): number {\n return this.evalCache.hits;\n }\n\n constructor(context: ValueContext, astContext: ASTContext) {\n this.treeContext = astContext;\n this.context = context;\n }\n\n public run(\n ast: AstNode,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false,\n disableCache: boolean = false\n ): Value | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n this.disableCache = disableCache;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext();\n this.evalCache.clear();\n this.callSiteStack = [];\n this.iterationCounter = 0;\n }\n\n private errorNode(node: AstNode): AstNode {\n if (this.callSiteStack.length > 0) {\n return this.callSiteStack[this.callSiteStack.length - 1];\n }\n return node;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n const target = this.errorNode(node);\n this.reporter?.({ code, from: target.from, to: target.to, params });\n if (this.annotateErrors) {\n annotateError(target, code, params);\n }\n return null;\n }\n\n private tick(node: AstNode, counter: number = 1): boolean {\n this.iterationCounter += counter;\n if (this.iterationCounter > MAX_ITERATIONS) {\n this.onError(RSErrorCode.iterationsLimit, node, [String(MAX_ITERATIONS)]);\n return false;\n }\n return true;\n }\n\n private dispatchDeclare(node: AstNode, value: Value): void {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, value);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, value as Value[]);\n case TokenID.NT_ARG_DECL:\n return this.dispatchDeclare(node.children[0], value);\n }\n }\n\n private declareLocal(node: AstNode, value: Value): void {\n const alias = getNodeText(node);\n this.locals.setLocal(alias, value);\n }\n\n private declareTuple(node: AstNode, value: Value[]): void {\n for (let child = 0; child < node.children.length; child++) {\n this.dispatchDeclare(node.children[child], value[child + 1]);\n }\n }\n\n private dispatchVisit(node: AstNode): Value | null {\n const info = this.nodeMetadata.get(node);\n let stamp: string | null = null;\n if (info.cacheable && !this.disableCache) {\n stamp = this.locals.buildDependencyStamp(info.reads);\n if (stamp !== null) {\n const cached = this.evalCache.lookup(info.structuralKey, stamp);\n if (cached !== undefined) {\n return cached;\n }\n }\n }\n\n const result = this.dispatchVisitImpl(node);\n if (!this.disableCache && result !== null && info.cacheable && stamp !== null) {\n this.evalCache.store(info.structuralKey, stamp, result);\n }\n return result;\n }\n\n private dispatchVisitImpl(node: AstNode): Value | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n return this.visitGlobal(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n return this.visitLocal(node);\n\n case TokenID.LIT_INTEGER:\n return this.visitInteger(node);\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return this.onError(RSErrorCode.iterateInfinity, node);\n\n case TokenID.LIT_EMPTYSET:\n return EmptySetV;\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BOOL:\n return this.visitBool(node);\n\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.REDUCE:\n return this.visitReduce(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.onError(RSErrorCode.calculationNotSupported, node);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): Value | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitGlobal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n const value = this.context.get(alias);\n if (value === undefined) {\n return this.onError(RSErrorCode.calcGlobalMissing, node, [alias]);\n }\n return value;\n }\n\n private visitLocal(node: AstNode): Value | null {\n const alias = getNodeText(node);\n return this.locals.getLocal(alias);\n }\n\n private visitFunctionCall(node: AstNode): Value | null {\n const funcName = getNodeText(node.children[0]);\n const ast = this.treeContext.get(funcName);\n if (!ast) {\n return this.onError(RSErrorCode.calcGlobalMissing, node.children[0], [funcName]);\n }\n if (!this.tick(node, TICK_PER_FUNCTION)) {\n return null;\n }\n\n const args: Value[] = [];\n for (let i = 1; i < node.children.length; i++) {\n const arg = this.visitChild(node, i);\n if (arg === null) {\n return null;\n }\n args.push(arg);\n }\n\n this.locals.startScope();\n for (let i = 0; i < args.length; i++) {\n this.dispatchDeclare(ast.children[0].children[i], args[i]);\n }\n this.callSiteStack.push(node);\n let result: Value | null;\n try {\n result = this.visitChild(ast, 1);\n } finally {\n this.callSiteStack.pop();\n }\n this.locals.endScope();\n return result;\n }\n\n private visitInteger(node: AstNode): Value | null {\n const value = node.data.dataType === 'number' ? (node.data.value as number) : Number(node.data.value);\n return Math.floor(value);\n }\n\n private visitArithmetic(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n const v2 = this.visitChild(node, 1);\n if (v1 === null || v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n switch (node.typeID) {\n case TokenID.PLUS:\n return a + b;\n case TokenID.MINUS:\n return a - b;\n case TokenID.MULTIPLY:\n return a * b;\n }\n return null;\n }\n\n private visitCard(node: AstNode): Value | null {\n const base = this.visitChild(node, 0);\n if (base === null || !Array.isArray(base)) {\n return null;\n }\n return base.length;\n }\n\n private visitQuantifier(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1) as Value[];\n if (domain === null) {\n return null;\n }\n const isUniversal = node.typeID === TokenID.QUANTOR_UNIVERSAL;\n if (domain.length === 0) {\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n const varNodes = node.children[0].typeID === TokenID.NT_ENUM_DECL ? node.children[0].children : [node.children[0]];\n const count = domain.length;\n const iterators: number[] = [];\n for (const declaration of varNodes) {\n iterators.push(0);\n this.dispatchDeclare(declaration, domain[0]);\n }\n let finishIteration = false;\n while (!finishIteration) {\n const iterationValue = this.visitChild(node, 2);\n if (iterationValue === null) {\n return null;\n }\n if ((iterationValue === VALUE_TRUE) !== isUniversal) {\n return !isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n let incrementIndex = iterators.length - 1;\n while (true) {\n if (iterators[incrementIndex] < count - 1) {\n iterators[incrementIndex]++;\n if (!this.tick(node, TICK_PER_QUANTIFIER)) {\n return null;\n }\n this.dispatchDeclare(varNodes[incrementIndex], domain[iterators[incrementIndex]]);\n incrementIndex = iterators.length - 1;\n break;\n } else if (incrementIndex === 0) {\n finishIteration = true;\n break;\n } else {\n iterators[incrementIndex] = 0;\n this.dispatchDeclare(varNodes[incrementIndex], domain[0]);\n incrementIndex--;\n }\n }\n }\n return isUniversal ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitNegation(node: AstNode): Value | null {\n const value = this.visitChild(node, 0);\n if (value === null) {\n return null;\n }\n return (value as number) === VALUE_TRUE ? VALUE_FALSE : VALUE_TRUE;\n }\n\n private tryEvaluateFromFirstArg(op: number, first: boolean): Value | null {\n if ((op === TokenID.LOGIC_AND && !first) || (op === TokenID.LOGIC_OR && first)) {\n return first ? VALUE_TRUE : VALUE_FALSE;\n }\n if (op === TokenID.LOGIC_IMPLICATION && !first) {\n return VALUE_TRUE;\n }\n return null;\n }\n\n private visitLogicBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const b1 = v1 === VALUE_TRUE;\n const attempt = this.tryEvaluateFromFirstArg(node.typeID, b1);\n if (attempt !== null) {\n return attempt;\n }\n\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const b2 = v2 === VALUE_TRUE;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.LOGIC_AND:\n result = b1 && b2;\n break;\n case TokenID.LOGIC_OR:\n result = b1 || b2;\n break;\n case TokenID.LOGIC_IMPLICATION:\n result = !b1 || b2;\n break;\n case TokenID.LOGIC_EQUIVALENT:\n result = b1 === b2;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitEquals(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const areEqual = compare(v1, v2) === 0;\n return areEqual === (node.typeID !== TokenID.NOTEQUAL) ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitIntegerPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n const a = v1 as number;\n const b = v2 as number;\n let result: boolean;\n switch (node.typeID) {\n case TokenID.GREATER:\n result = a > b;\n break;\n case TokenID.LESSER:\n result = a < b;\n break;\n case TokenID.GREATER_OR_EQ:\n result = a >= b;\n break;\n case TokenID.LESSER_OR_EQ:\n result = a <= b;\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitSetexprPredicate(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n let result: boolean;\n switch (node.typeID) {\n case TokenID.SET_IN:\n result = contains(v2 as Value[], v1);\n break;\n case TokenID.SET_NOT_IN:\n result = !contains(v2 as Value[], v1);\n break;\n case TokenID.SUBSET:\n result = compare(v1, v2) !== 0 && isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.NOT_SUBSET:\n result = compare(v1, v2) === 0 || !isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n case TokenID.SUBSET_OR_EQ:\n result = isSubsetOrEq(v1 as Value[], v2 as Value[]);\n break;\n default:\n return null;\n }\n return result ? VALUE_TRUE : VALUE_FALSE;\n }\n\n private visitDecart(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i) as Value[];\n if (component === null) {\n return null;\n }\n if (component.length === 0) {\n return EmptySetV;\n }\n args.push(component);\n }\n const result = cartesianProduct(args as Value[][]);\n if (result === null) {\n this.onError(RSErrorCode.setOverflow, node, [String(SET_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): Value | null {\n const base = this.visitChild(node, 0) as Value[];\n if (base === null) {\n return null;\n }\n const result = boolean(base);\n if (result === null) {\n this.onError(RSErrorCode.booleanBaseLimit, node.children[0], [String(BOOL_INFINITY)]);\n return null;\n }\n return result;\n }\n\n private visitTuple(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const component = this.visitChild(node, i);\n if (component === null) {\n return null;\n }\n args.push(component);\n }\n return tuple(args);\n }\n\n private visitEnumeration(node: AstNode): Value | null {\n const args: Value[] = [];\n for (let i = 0; i < node.children.length; i++) {\n const element = this.visitChild(node, i);\n if (element === null) {\n return null;\n }\n args.push(element);\n }\n return set(args);\n }\n\n private visitBool(node: AstNode): Value | null {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n return [element];\n }\n\n private visitDebool(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n if (target.length !== 1) {\n return this.onError(RSErrorCode.calcInvalidDebool, node.children[0]);\n }\n return target[0];\n }\n\n private visitSetexprBinary(node: AstNode): Value | null {\n const v1 = this.visitChild(node, 0);\n if (v1 === null) {\n return null;\n }\n const v2 = this.visitChild(node, 1);\n if (v2 === null) {\n return null;\n }\n switch (node.typeID) {\n case TokenID.SET_UNION:\n return setUnion(v1 as Value[], v2 as Value[]);\n case TokenID.SET_INTERSECTION:\n return setIntersection(v1 as Value[], v2 as Value[]);\n case TokenID.SET_MINUS:\n return setDiff(v1 as Value[], v2 as Value[]);\n case TokenID.SET_SYMMETRIC_MINUS:\n return setSymDiff(v1 as Value[], v2 as Value[]);\n }\n return null;\n }\n\n private visitProjectSet(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n return projection(target as Value[][], indices);\n }\n\n private visitProjectTuple(node: AstNode): Value | null {\n const target = this.visitChild(node, 0) as Value[];\n if (target === null) {\n return null;\n }\n const indices = getNodeIndices(node);\n const components = indices.map(i => target[i]);\n return components.length === 1 ? components[0] : tuple(components);\n }\n\n private visitFilter(node: AstNode): Value | null {\n const lastIdx = node.children.length - 1;\n const argVal = this.visitChild(node, lastIdx) as Value[][];\n if (argVal === null) {\n return null;\n }\n if (argVal.length === 0) {\n return EmptySetV;\n }\n\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === lastIdx;\n if (tupleParam) {\n const params: Value[] = [];\n for (let i = 0; i < lastIdx; i++) {\n const param = this.visitChild(node, i) as Value[];\n if (param === null) {\n return null;\n }\n if (param.length === 0) {\n return EmptySetV;\n }\n params.push(param);\n }\n const result: Value[] = [];\n for (const element of argVal) {\n let valid = true;\n for (let j = 0; j < indices.length; j++) {\n const comp = element[indices[j]];\n const paramSet = params[j] as Value[];\n if (!contains(paramSet, comp)) {\n valid = false;\n break;\n }\n }\n if (valid) {\n result.push(element);\n }\n }\n return result;\n } else {\n const paramVal = this.visitChild(node, 0) as Value[];\n if (paramVal === null) {\n return null;\n }\n if (paramVal.length === 0) {\n return EmptySetV;\n }\n\n const result: Value[] = [];\n for (const element of argVal) {\n const comps = indices.map(i => element[i]);\n const testElement = comps.length === 1 ? comps[0] : tuple(comps);\n if (contains(paramVal, testElement)) result.push(element);\n }\n return result;\n }\n }\n\n private visitReduce(node: AstNode): Value | null {\n const target = this.visitChild(node, 0);\n if (target === null) {\n return null;\n }\n return reduce(target as Value[][]);\n }\n\n private visitDeclarative(node: AstNode): Value | null {\n const domain = this.visitChild(node, 1);\n if (domain === null) {\n return null;\n }\n\n const elements = [];\n for (const element of domain as Value[]) {\n if (!this.tick(node, TICK_PER_DECLARATIVE)) {\n return null;\n }\n this.dispatchDeclare(node.children[0], element);\n const value = this.visitChild(node, 2);\n if (value === null) {\n return null;\n }\n if (value === VALUE_TRUE) {\n elements.push(element);\n }\n }\n return elements.length === 0 ? EmptySetV : elements;\n }\n\n private visitImperative(node: AstNode): Value | null {\n const result: Value[] = [];\n const frames: IterationFrame[] = [];\n\n let currentChild = 1;\n\n // Advance to next iteration\n const advanceIterator = (): boolean => {\n while (frames.length > 0) {\n const top = frames[frames.length - 1];\n if (top.valueID < top.domain.length - 1) {\n top.valueID++;\n const nextValue = top.domain[top.valueID];\n if (!this.tick(node.children[top.childID], TICK_PER_IMPERATIVE)) {\n return false;\n }\n this.dispatchDeclare(node.children[top.childID].children[0], nextValue);\n currentChild = top.childID + 1;\n return true;\n }\n frames.pop();\n }\n return false;\n };\n\n while (true) {\n // Iteration end - create element and pop up stack\n if (currentChild >= node.children.length) {\n const element = this.visitChild(node, 0);\n if (element === null) {\n return null;\n }\n result.push(element);\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n\n // Iteration node\n const child = node.children[currentChild];\n if (child.typeID === TokenID.ITERATE) {\n const domain = this.visitChild(child, 1) as Value[];\n if (domain === null) {\n return null;\n }\n if (domain.length === 0) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n if (!this.tick(child, TICK_PER_IMPERATIVE)) {\n return null;\n }\n frames.push({\n childID: currentChild,\n domain,\n valueID: 0\n });\n this.dispatchDeclare(child.children[0], domain[0]);\n currentChild++;\n continue;\n }\n\n // Guard expression\n const value = this.dispatchVisit(child);\n if (value === null) {\n return null;\n }\n if (value === VALUE_FALSE) {\n if (!advanceIterator()) {\n break;\n }\n continue;\n }\n currentChild++;\n }\n return set(result);\n }\n\n private visitAssign(node: AstNode): Value | null {\n const value = this.visitChild(node, 1);\n if (value === null) {\n return null;\n }\n this.dispatchDeclare(node.children[0], value);\n return VALUE_TRUE;\n }\n\n private visitRecursion(node: AstNode): Value | null {\n const initialValue = this.visitChild(node, 1);\n if (initialValue === null) {\n return null;\n }\n const bodyIndex = node.typeID === TokenID.NT_RECURSIVE_FULL ? 3 : 2;\n let current: Value = initialValue;\n while (true) {\n if (!this.tick(node, TICK_PER_RECURSION)) {\n return null;\n }\n\n this.dispatchDeclare(node.children[0], current);\n if (node.typeID === TokenID.NT_RECURSIVE_FULL) {\n const pred = this.visitChild(node, 2);\n if (pred === null) {\n return null;\n }\n if (pred !== VALUE_TRUE) {\n break;\n }\n }\n\n const next = this.visitChild(node, bodyIndex);\n if (next === null) {\n return null;\n }\n if (compare(current, next) === 0) {\n break;\n }\n current = next;\n }\n\n return current;\n }\n}\n\n/** Imperative iteration block data. */\ninterface IterationFrame {\n childID: number;\n domain: Value[];\n valueID: number;\n}\n\n/** Local variable binding with version for cache invalidation. */\ninterface LocalBinding {\n id: number;\n version: number;\n value: Value;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private nextBindingId = 1;\n private data = new Map<string, LocalBinding>();\n private callStack: Map<string, LocalBinding>[] = [];\n\n startScope(): void {\n this.callStack.push(this.data);\n this.data = new Map();\n }\n\n endScope(): void {\n this.data = this.callStack.pop()!;\n }\n\n setLocal(alias: string, value: Value): void {\n const existing = this.data.get(alias);\n if (existing) {\n existing.value = value;\n existing.version++;\n } else {\n this.data.set(alias, { id: this.nextBindingId++, version: 0, value });\n }\n }\n\n getLocal(alias: string): Value {\n const binding = this.data.get(alias);\n if (binding === undefined) {\n throw new Error(`Local variable \"${alias}\" not found`);\n }\n return binding.value;\n }\n\n buildDependencyStamp(reads: ReadonlySet<string>): string | null {\n if (reads.size === 0) {\n return '';\n }\n const parts: string[] = [];\n for (const alias of [...reads].sort()) {\n const binding = this.data.get(alias);\n if (binding === undefined) {\n return null;\n }\n parts.push(`${binding.id}:${binding.version}`);\n }\n return parts.join('|');\n }\n}\n","/**\n * Module: API for calculations.\n */\n\nimport { type AstNode } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { RSErrorCode, type RSErrorDescription } from '../error';\nimport { type ExpressionType } from '../semantic/typification';\n\nimport { type ASTContext, Evaluator } from './evaluator';\nimport { type Value, type ValueContext } from './value';\nimport { validateValue } from './value-api';\n\n/** Result of calculator evaluation. */\nexport interface CalculatorResult {\n value: Value | null;\n iterations: number;\n cacheHits: number;\n errors: RSErrorDescription[];\n}\n\n/** Options for {@link RSCalculator.evaluateFull}. */\nexport interface CalculatorEvaluateOptions {\n annotateErrors?: boolean;\n disableCache?: boolean;\n}\n\ntype Listener = () => void;\n\n/** AST calculator - evaluates RS expressions via visitor pattern and provides updates via listeners. */\nexport class RSCalculator {\n private context: ValueContext = new Map();\n private treeContext: ASTContext = new Map();\n private evaluator: Evaluator = new Evaluator(this.context, this.treeContext);\n\n private listeners = new Map<string, Set<Listener>>();\n\n public subscribe = (alias: string, listener: Listener) => {\n let notifyList = this.listeners.get(alias);\n\n if (!notifyList) {\n notifyList = new Set();\n this.listeners.set(alias, notifyList);\n }\n\n notifyList.add(listener);\n return () => {\n notifyList.delete(listener);\n if (notifyList.size === 0) {\n this.listeners.delete(alias);\n }\n };\n };\n\n public setValue(alias: string, value: Value): void {\n this.context.set(alias, value);\n this.notify(alias);\n }\n\n public resetValue(alias: string): void {\n this.context.delete(alias);\n this.notify(alias);\n }\n\n public clearAllAst(): void {\n this.treeContext.clear();\n }\n\n public getValue(alias: string): Value | null {\n return this.context.get(alias) ?? null;\n }\n\n public setAST(alias: string, ast: AstNode): void {\n this.treeContext.set(alias, ast);\n }\n\n public validate(value: Value, type: ExpressionType): boolean {\n return validateValue(value, type, this.context);\n }\n\n public evaluateFast(ast: AstNode): Value | null {\n if (ast.hasError) {\n return null;\n }\n return this.evaluator.run(ast);\n }\n\n public evaluateFull(ast: AstNode, options?: CalculatorEvaluateOptions): CalculatorResult {\n const errors: RSErrorDescription[] = [];\n const reporter = (error: RSErrorDescription) => {\n errors.push(error);\n };\n\n if (ast.hasError) {\n return { value: null, iterations: 0, cacheHits: 0, errors };\n }\n\n const value = this.evaluator.run(ast, reporter, options?.annotateErrors ?? false, options?.disableCache ?? false);\n if (value === null && errors.length === 0) {\n errors.push({ code: RSErrorCode.calcUnknownError, from: 0, to: 0 });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.calcUnknownError);\n }\n }\n return {\n value,\n iterations: this.evaluator.iterationCounter,\n cacheHits: this.evaluator.cacheHits,\n errors\n };\n }\n\n private notify(alias: string) {\n const set = this.listeners.get(alias);\n if (!set) return;\n\n for (const l of set) {\n l();\n }\n }\n}\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nimport {LRParser} from \"@lezer/lr\"\nexport const parser = LRParser.deserialize({\n version: 14,\n states: \"2lO!sQPOOOVQPO'#CdO$qQPO'#C`O&pQPO'#C`O*bQPO'#C_Q*jQPOOO,TQPO'#CyOVQPO'#CtO,]QPO'#CtOOQO'#Ct'#CtOOQO'#C^'#C^OOQO'#ES'#ESOOQO'#ET'#ETO,bQPO'#DeO,iQPO'#DfO,qQPO'#DhO,vQPO'#DjO,{QPO'#DnO-QQPO'#DrOOQO'#EU'#EUOOQO'#EV'#EVOOQO'#DS'#DSO-VQPO'#DSO-[QPO'#DSOOQO'#EQ'#EQO,TQPO'#DzQOQPOOO-aQPO'#ERO-nQPO,59OO-vQPO'#CeO-{QPO,58xO/lQPO,59tOVQPO,58yOVQPO,58yOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59iOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO,59tOVQPO'#CdOOQO'#C`'#C`OOQO'#C{'#C{O1]QPO,59eO2rQPO,59`OVQPO,59`OOQO'#ER'#ERO5TQPO,5:PO5]QPO,5:UOVQPO,5:QOOQO,5:Q,5:QOVQPO,5:SO,TQPO,5:UOVQPO,5:YO,TQPO,5:^OVQPO,59nOVQPO,59nO5dQPO'#D|OOQO'#D{'#D{O5iQPO,5:fOOQO1G.j1G.jOVQPO,59POOQO1G.d1G.dOOQO1G/`1G/`O5qQPO1G.eO7vQPO1G.eO:zQPO1G/TO=]QPO1G/TO?nQPO1G/TOBPQPO1G/TOGyQPO1G/`OHQQPO1G/`OKpQPO1G/`O! `QPO1G/`O! gQPO1G/`O! nQPO1G/`O! uQPO1G/`O,TQPO,59gOVQPO1G/PO!%aQPO1G.zOOQO1G/k1G/kOVQPO1G/pO!%iQPO1G/lO!%pQPO1G/nO!%xQPO1G/pO!%}QPO1G/tO!&UQPO1G/xO!&ZQPO1G/YO!&cQPO1G/YOVQPO,5:hO,TQPO,5:gOVQPO1G0QO!&jQPO1G.kOOQO1G/R1G/RO!&zQPO7+$kOOQO7+$f7+$fO!(gQPO7+%[OOQO7+%W7+%WO!(nQPO7+%YOVQPO7+%[OVQPO7+%`OVQPO7+%dOOQO7+$t7+$tO!(sQPO1G0SOOQO1G0R1G0RO!(}QPO7+%lO!)UQPO<<HVOVQPO<<HvOVQPO<<HtO!+gQPO<<HvO!+nQPO'#DoO!+xQPO<<HzO!,QQPO<<IOO!,XQPOAN>bO!,`QPOAN>`OVQPOAN>bOVQPO,5:ZOOQOAN>fAN>fOVQPOAN>jOOQOG23|G23|OOQOG23zG23zO!,gQPOG23|O!,nQPO1G/uO!,xQPOG24UOOQOLD)hLD)hOOQOLD)pLD)pOVQPOLD)pO!-SQPO!$'M[OOQO!)9Bv!)9Bv\",\n stateData: \"!-l~O!sOS~OTQOVPOiVOjWOnUOpUOwZOxZOyZOz[O{[O!W]O!Z^O!]_O!``O!aaO!ebO!gfO!hdO!idO!jdO!kdO!ldO!mdO~OkiO~PVOZSX[SX]!wX^!wX_!wX`!wXa!wXb!wXc!wXd!wXe!wXf!wXg!wXr!wXs!wXt!wXu!wX}!wX!O!wX!P!wX!Q!wX!R!wX!S!wX!T!wX!U!wXY!wX!V!wX~O!q!wXU!wXl!wX!_!wXT!wXV!wXi!wXj!wXn!wXp!wXw!wXx!wXy!wXz!wX{!wX!W!wX!Z!wX!]!wX!`!wX!a!wX!e!wX!g!wX!h!wX!i!wX!j!wX!k!wX!l!wX!m!wX!d!wX~P!zOZSX[SX]!xX^!xX_!xX`!xXa!xXb!xXc!xXd!xXe!xXf!xXg!xXr!xXs!xXt!xXu!xX}!xX!O!xX!P!xX!Q!xX!R!xX!S!xX!T!xX!U!xX!q!xXY!xX!V!xXU!xXl!xX!_!xXT!xXV!xXi!xXj!xXn!xXp!xXw!xXx!xXy!xXz!xX{!xX!W!xX!Z!xX!]!xX!`!xX!a!xX!e!xX!g!xX!h!xX!i!xX!j!xX!k!xX!l!xX!m!xX!d!xX~OZpO[pO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~OT!POV!OO~Ok!TO~OT!WO~PYOV!XO!Z^O~Ok!ZO~O!W![O~O!W!]O~O!W!^O~Ok!_O~OV!`O~OY!uX!V!uXl!uX~P*jOU!dOY!uX~OY!eO~OU!fOY!tX]!tX^!tX_!tX`!tXa!tXb!tXc!tXd!tXe!tXf!tXg!tXr!tXs!tXt!tXu!tX}!tX!O!tX!P!tX!Q!tX!R!tX!S!tX!T!tX!U!tX~OU!gOYvX]vX^vX_vX`vXavXbvXcvXdvXevXfvXgvXrvXsvXtvXuvX}vX!OvX!PvX!QvX!RvX!SvX!TvX!UvX~OY!uO]!vO~O]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~Orhashathauha!qhaUhaYha!Vhalha!_haThaVhaihajhanhaphawhaxhayhazha{ha!Wha!Zha!]ha!`ha!aha!eha!gha!hha!iha!jha!kha!lha!mha!dha~P1eOY!eO!V!xO~O]!yO~P!zO]#RO~OY#SOl#TO~O!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P*jO]Ri^Ri_Ri`RiaRibRicRidRieRifRigRirRisRitRiuRi!qRiURiYRi!VRilRi!_RiTRiVRiiRijRinRipRiwRixRiyRizRi{Ri!WRi!ZRi!]Ri!`Ri!aRi!eRi!gRi!hRi!iRi!jRi!kRi!lRi!mRi!dRi~P+iOssOttOuuOrqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOttOuuOrqisqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOuuOrqisqitqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eOrqisqitqiuqi!qqiUqiYqi!Vqilqi!_qiTqiVqiiqijqinqipqiwqixqiyqizqi{qi!Wqi!Zqi!]qi!`qi!aqi!eqi!gqi!hqi!iqi!jqi!kqi!lqi!mqi!dqi~P1eO}vO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!P|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!O|i~PDbO!OwO~PDbO}vO!OwO!PxO!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!R|i!S|i!T|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!Q|i~PHXO}vO!OwO!PxO!QyO!T|O!U}O]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!S|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~O!R|i~PKwO!RzO~PKwO!QyO~PHXO}vO!OwO!PxO]|i^|i_|i`|ia|ib|ic|id|ie|if|ig|ir|is|it|iu|i!Q|i!R|i!S|i!T|i!U|i!q|iU|iY|i!V|il|i!_|iT|iV|ii|ij|in|ip|iw|ix|iy|iz|i{|i!W|i!Z|i!]|i!`|i!a|i!e|i!g|i!h|i!i|i!j|i!k|i!l|i!m|i!d|i~OY!eOl#XO~OU#ZO~P*jOY!eOl#[O~O]#]O~O!_#^O~P*jO[#_O~OY!eOl#`O~OU#`O~P*jOUXiYXi!VXilXi~P*jO]qO^qO_qO`qOaqObqOcqOdqOeqOfqOgqOrrOssOttOuuO}vO!OwO!PxO!QyO!RzO!S{O!T|O!U}O~PVO!_#eO~P*jOV#fO~OY!pil!pi~P*jO!q!nq~P*jOrmysmytmyumy!qmyUmyYmy!Vmylmy!_myTmyVmyimyjmynmypmywmyxmyymyzmy{my!Wmy!Zmy!]my!`my!amy!emy!gmy!hmy!imy!jmy!kmy!lmy!mmy!dmy~P1eO!_#mO~P*jO!V!cX!d!cX~P*jO!V#oO!d#nO~O!_#pO~P*jO!V#qO~P*jOU#rO~P*jO!V#vO~P*jO!V!ci!d!ci~P*jO!V#wO!_#xO~P*jO!V#zO~P*jO!]!hj!gz{!j!k!l!m!iT!e!a!`!a~\",\n goto: \"1O!zPP!{#y$uPPP&R'VPPPPPPPPPPPPPP#yPPPP'aP(]P#yPPPP(`PPPPP)[PPPPPPPPPP*Y+UP*YP*YPPP*Y,TPP*YPPPPPPP,W,Z,^PPP,d.v/W/W/W0S!phOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRnP!sYOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rSOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xQ!QUS!ai#SQ!|![Q#O!^R#V!u!rROPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x]!PUi![!^!u#SSlP!OX!U]!T!Z!_!sXOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!RU!shOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!peOV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xRoP!scOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!rcOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#xR!Y^R#i#^RjOR!ciQ!biR#b#SQTO[kP]!O!T!Z!_Q!SVQ!gvQ!hpQ!iqQ!jrQ!ksQ!ltQ!muQ!nwQ!oxQ!pyQ!qzQ!r{Q!s|Q!t}Q!z!XQ!}!]Q#Q!`Q#U!eQ#W!vQ#Y!yQ#a#RQ#c#TQ#d#WQ#g#]Q#h#^Q#j#_Q#k#eQ#l#fQ#s#mQ#t#nQ#u#pR#y#xSmP!OQ!V]Q!w!TQ!{!ZR#P!_!seOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x!sgOPV]pqrstuvwxyz{|}!O!T!X!Z!]!_!`!e!v!y#R#T#W#]#^#_#e#f#m#n#p#x\",\n nodeNames: \"⚠ Expression Logic Logic_predicates Variable Local ) ( Tuple Expr_enum_min2 , :∈ := ∈ ∉ ⊆ ⊄ ⊂ > ≥ < ≤ ≠ = Logic_unary ¬ Predicate [ ] Logic_quantor ∀ Variable_pack ∃ Logic_binary ⇔ ⇒ ∨ & Setexpr Integer EmptySet IntegerSet Global Radical Setexpr_binary * + - ∪ \\\\ ∆ ∩ × } { Enumeration Boolean ℬ Filter_expression Filter Declarative | PrefixD PrefixI Imperative Imp_blocks ; PrefixR Recursion Function BigPr SmallPr Card Bool Debool Red Function_decl Arguments Declaration\",\n maxTerm: 87,\n nodeProps: [\n [\"openedBy\", 6,\"(\",53,\"{\"],\n [\"closedBy\", 7,\")\",54,\"}\"]\n ],\n skippedNodes: [0],\n repeatNodeCount: 0,\n tokenData: \"6j~R!jX^%spq%svw&hxy&myz&rz{&w{|&||}'R}!O'W!Q![']![!]'e!]!^'x!^!_'}!_!`(S!`!a(X!c!d(^!e!f(^!f!g(l!h!i(t!k!l)h!p!q(^!r!s)m!t!u*a!u!v(^!v!w(^!z!{(^!|!}*q!}#O*v#O#P*{#P#Q+Q#R#S+V#T#U+V#U#V+m#V#W-]#W#X.x#X#d+V#d#e1b#e#f+V#f#g2w#g#o+V#o#p4R#p#q4W#q#r4]#y#z%s$f$g%s$r$s4b%o%p4g5i6S+V#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s% l% m4l%%Y%%Z4q%%[%%]4v%&Y%&Z4{%&]%&^5Q%&_%&`5V%&`%&a5[%&b%&c5a%&c%&d5f%'S%'T5k%'T%'U5p%'U%'V5u%(^%(_5z%(b%(c6P%(c%(d6U%)Q%)R6Z%)S%)T6`%)U%)V6e&FU&FV%s~%xY!s~X^%spq%s#y#z%s$f$g%s#BY#BZ%s$IS$I_%s$I|$JO%s$JT$JU%s$KV$KW%s&FU&FV%s~&mOu~~&rOV~~&wOU~~&|O}~~'RO!O~~'WOY~~']O!P~~'bPw~!Q![']~'hQ!_!`'n%&b%&c's~'sO[~~'xOZ~~'}O!d~~(SOd~~(XOg~~(^Ob~~(aP!Q![(d~(iPz~!Q![(d~(qP!`~!Q![(d~(wQ!Q![(}#]#^)V~)SP!g~!Q![(}~)YP!R![)]~)bQ!]~|})V!Q![)]~)mO!a~~)pQ!Q![)v#f#g*O~){Pj~!Q![)v~*RP!R![*U~*ZQ!h~|}*O!Q![*U~*fP!e~!Q![*i~*nP{~!Q![*i~*vOy~~*{Ok~~+QO!R~~+VOl~~+[RT~!Q![+e#T#o+V5i6S+V~+jPT~!Q![+e~+rTT~!Q![+e#T#c+V#c#d,R#d#o+V5i6S+V~,WTT~!Q![+e#T#c+V#c#d,g#d#o+V5i6S+V~,lTT~!Q![+e#T#`+V#`#a,{#a#o+V5i6S+V~-SR!k~T~!Q![+e#T#o+V5i6S+V~-bST~!Q![+e#T#U-n#U#o+V5i6S+V~-sTT~!Q![+e#T#f+V#f#g.S#g#o+V5i6S+V~.XTT~!Q![+e#T#W+V#W#X.h#X#o+V5i6S+V~.oR!j~T~!Q![+e#T#o+V5i6S+V~.}TT~!Q![+e#T#X+V#X#Y/^#Y#o+V5i6S+V~/cTT~!Q![+e#T#U+V#U#V/r#V#o+V5i6S+V~/wTT~!Q![+e#T#c+V#c#d0W#d#o+V5i6S+V~0]TT~!Q![+e#T#c+V#c#d0l#d#o+V5i6S+V~0qTT~!Q![+e#T#`+V#`#a1Q#a#o+V5i6S+V~1XR!l~T~!Q![+e#T#o+V5i6S+V~1gTT~!Q![+e#T#f+V#f#g1v#g#o+V5i6S+V~1{ST~!Q!R+e!R![2X#T#o+V5i6S+V~2`Q!i~T~|}2f!Q![2X~2iP!R![2l~2qQ!i~|}2f!Q![2l~2|TT~!Q![+e#T#X+V#X#Y3]#Y#o+V5i6S+V~3bTT~!Q![+e#T#W+V#W#X3q#X#o+V5i6S+V~3xR!m~T~!Q![+e#T#o+V5i6S+V~4WO!W~~4]O!_~~4bO!V~~4gOi~~4lO!U~~4qO!Z~~4vOs~~4{Or~~5QOn~~5VOp~~5[Ox~~5aO!S~~5fO]~~5kO^~~5pOt~~5uO!T~~5zO!Q~~6POf~~6UOe~~6ZOc~~6`Oa~~6eO`~~6jO_~\",\n tokenizers: [0],\n topRules: {\"Expression\":[0,1]},\n tokenPrec: 2679\n})\n","// This file was generated by lezer-generator. You probably shouldn't edit it.\nexport const\n Expression = 1,\n Logic = 2,\n Logic_predicates = 3,\n Variable = 4,\n Local = 5,\n Tuple = 8,\n Expr_enum_min2 = 9,\n Logic_unary = 24,\n Predicate = 26,\n Logic_quantor = 29,\n Variable_pack = 31,\n Logic_binary = 33,\n Setexpr = 38,\n Integer = 39,\n EmptySet = 40,\n IntegerSet = 41,\n Global = 42,\n Radical = 43,\n Setexpr_binary = 44,\n Enumeration = 55,\n Boolean = 56,\n Filter_expression = 58,\n Filter = 59,\n Declarative = 60,\n PrefixD = 62,\n PrefixI = 63,\n Imperative = 64,\n Imp_blocks = 65,\n PrefixR = 67,\n Recursion = 68,\n Function = 69,\n BigPr = 70,\n SmallPr = 71,\n Card = 72,\n Bool = 73,\n Debool = 74,\n Red = 75,\n Function_decl = 76,\n Arguments = 77,\n Declaration = 78\n","/**\n * Module: Transforming AST to a simple form.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\n\nimport {\n Arguments,\n BigPr,\n Bool,\n Boolean,\n Card,\n Debool,\n Declaration,\n Declarative,\n EmptySet,\n Enumeration,\n Expr_enum_min2,\n Expression,\n Filter,\n Filter_expression,\n Function,\n Function_decl,\n Global,\n Imp_blocks,\n Imperative,\n Integer,\n IntegerSet,\n Local,\n Logic,\n Logic_binary,\n Logic_predicates,\n Logic_quantor,\n Logic_unary,\n Predicate,\n PrefixD,\n Radical,\n Recursion,\n Red,\n Setexpr,\n Setexpr_binary,\n SmallPr,\n Tuple,\n Variable,\n Variable_pack\n} from './parser.terms';\nimport { TokenID } from './token';\n\n/** Normalizes AST to a simple form. */\nexport function normalizeAST(ast: AstNode, input: string) {\n visitAstDFS(ast, node => normalizeNode(node, input));\n}\n\n// ====== Internals =========\nconst idRecord: Record<number, TokenID> = {\n [Global]: TokenID.ID_GLOBAL,\n [Local]: TokenID.ID_LOCAL,\n [Radical]: TokenID.ID_RADICAL,\n [Function]: TokenID.ID_FUNCTION,\n [Predicate]: TokenID.ID_PREDICATE,\n [Integer]: TokenID.LIT_INTEGER,\n [EmptySet]: TokenID.LIT_EMPTYSET,\n [IntegerSet]: TokenID.LIT_WHOLE_NUMBERS,\n\n [Boolean]: TokenID.BOOLEAN,\n\n [BigPr]: TokenID.BIGPR,\n [SmallPr]: TokenID.SMALLPR,\n [Filter]: TokenID.FILTER,\n\n [Bool]: TokenID.BOOL,\n [Debool]: TokenID.DEBOOL,\n [Red]: TokenID.REDUCE,\n [Card]: TokenID.CARD,\n\n [Enumeration]: TokenID.NT_ENUMERATION,\n [Tuple]: TokenID.NT_TUPLE,\n [Arguments]: TokenID.NT_ARGUMENTS,\n [Declaration]: TokenID.NT_ARG_DECL,\n [Function_decl]: TokenID.NT_FUNC_DEFINITION,\n [Variable_pack]: TokenID.NT_ENUM_DECL,\n [Declarative]: TokenID.NT_DECLARATIVE_EXPR,\n [Imperative]: TokenID.NT_IMPERATIVE_EXPR\n};\n\nfunction normalizeNode(node: AstNode, input: string) {\n if (node.hasError) {\n return;\n }\n switch (node.typeID) {\n case 0:\n return;\n\n case Expression:\n promoteSingleChild(node);\n return;\n\n case EmptySet:\n case IntegerSet:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'number';\n node.data.value = Number(input.slice(node.from, node.to));\n return;\n\n case Function:\n case Predicate:\n case Global:\n case Local:\n case Radical:\n case Integer:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string';\n node.data.value = input.slice(node.from, node.to);\n return;\n\n case Boolean:\n node.typeID = idRecord[node.typeID];\n if (node.children.length === 4) {\n node.children = [node.children[2]];\n } else {\n node.children = [node.children[1]];\n }\n clearData(node);\n return;\n\n case Filter:\n case BigPr:\n case SmallPr:\n node.typeID = idRecord[node.typeID];\n node.data.dataType = 'string[]';\n node.data.value = parseIndex(input.slice(node.from + 2, node.to));\n return;\n\n case Red:\n case Debool:\n case Bool:\n case Card:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n return;\n\n case Function_decl:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[1], node.children[3]];\n return;\n case Declaration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n node.children = [node.children[0], node.children[2]];\n return;\n\n case Arguments:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children.length === 3) {\n processLeftEnum(node);\n }\n return;\n\n case Expr_enum_min2:\n processLeftEnum(node);\n return;\n\n case Setexpr:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else if (node.children.length === 4) {\n processTextFunction(node);\n }\n return;\n\n case Tuple:\n case Enumeration:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[1].typeID === Expr_enum_min2) {\n for (const child of node.children[1].children) {\n child.parent = node;\n }\n node.children = node.children[1].children;\n } else {\n node.children = [node.children[1]];\n }\n return;\n\n case Logic_binary:\n case Logic_predicates:\n case Setexpr_binary:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n clearData(node);\n node.typeID = symbolToToken(node.children[1].data.value as string);\n if (node.typeID === TokenID.DECART) {\n processDecartChildren(node);\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n }\n return;\n\n case Filter_expression:\n processFilter(node);\n return;\n\n case Logic:\n if (node.children[0].data.value === '(') {\n processParenthesis(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_unary:\n if (node.children[0].data.value === '¬') {\n clearData(node);\n node.typeID = TokenID.LOGIC_NOT;\n node.children = [node.children[1]];\n } else if (node.children[0].typeID === TokenID.ID_PREDICATE) {\n processTextFunction(node);\n } else {\n promoteSingleChild(node);\n }\n return;\n\n case Logic_quantor:\n clearData(node);\n node.typeID = symbolToToken(node.children[0].data.value as string);\n node.children = [node.children[1], node.children[3], node.children[4]];\n return;\n\n case Variable:\n convertTupleDeclaration(node.children[0]);\n promoteSingleChild(node);\n return;\n\n case Variable_pack:\n if (node.children.length === 1) {\n promoteSingleChild(node);\n } else {\n node.typeID = idRecord[node.typeID];\n processLeftEnum(node);\n }\n return;\n\n case Declarative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n if (node.children[0].typeID === PrefixD) {\n node.children = [node.children[2], node.children[4], node.children[6]];\n } else {\n node.children = [node.children[1], node.children[3], node.children[5]];\n }\n return;\n\n case Imp_blocks:\n if (node.children.length === 1) {\n if (node.parent?.typeID === Imp_blocks) {\n promoteSingleChild(node);\n }\n } else {\n processLeftEnum(node);\n }\n return;\n\n case Imperative:\n node.typeID = idRecord[node.typeID];\n clearData(node);\n for (const child of node.children[4].children) {\n child.parent = node;\n }\n node.children = [node.children[2], ...node.children[4].children];\n return;\n\n case Recursion:\n if (node.children.length > 9) {\n node.typeID = TokenID.NT_RECURSIVE_FULL;\n node.children = [node.children[2], node.children[4], node.children[6], node.children[8]];\n } else {\n node.typeID = TokenID.NT_RECURSIVE_SHORT;\n node.children = [node.children[2], node.children[4], node.children[6]];\n }\n return;\n }\n}\n\nfunction convertTupleDeclaration(node: AstNode) {\n if (node.typeID !== TokenID.NT_TUPLE) {\n return;\n }\n node.typeID = TokenID.NT_TUPLE_DECL;\n for (const child of node.children) {\n convertTupleDeclaration(child);\n }\n}\n\nfunction clearData(node: AstNode) {\n node.data.value = null;\n node.data.dataType = 'null';\n}\n\nfunction promoteSingleChild(node: AstNode, index: number = 0) {\n for (const child of node.children[index].children) {\n child.parent = node;\n }\n node.typeID = node.children[index].typeID;\n node.data = node.children[index].data;\n node.parenthesis = node.children[index].parenthesis;\n node.children = node.children[index].children;\n}\n\nfunction parseIndex(text: string): string[] {\n return text.split(',');\n}\n\nfunction symbolToToken(symbol: string): TokenID {\n switch (symbol) {\n case '+':\n return TokenID.PLUS;\n case '-':\n return TokenID.MINUS;\n case '*':\n return TokenID.MULTIPLY;\n\n case '∪':\n return TokenID.SET_UNION;\n case '\\\\':\n return TokenID.SET_MINUS;\n case '∆':\n return TokenID.SET_SYMMETRIC_MINUS;\n case '∩':\n return TokenID.SET_INTERSECTION;\n case '×':\n return TokenID.DECART;\n\n case '∈':\n return TokenID.SET_IN;\n case '∉':\n return TokenID.SET_NOT_IN;\n case '⊆':\n return TokenID.SUBSET_OR_EQ;\n case '⊄':\n return TokenID.NOT_SUBSET;\n case '⊂':\n return TokenID.SUBSET;\n\n case '>':\n return TokenID.GREATER;\n case '≥':\n return TokenID.GREATER_OR_EQ;\n case '<':\n return TokenID.LESSER;\n case '≤':\n return TokenID.LESSER_OR_EQ;\n\n case '≠':\n return TokenID.NOTEQUAL;\n case '=':\n return TokenID.EQUAL;\n\n case ':∈':\n return TokenID.ITERATE;\n case ':=':\n return TokenID.ASSIGN;\n\n case '¬':\n return TokenID.LOGIC_NOT;\n\n case '⇔':\n return TokenID.LOGIC_EQUIVALENT;\n case '⇒':\n return TokenID.LOGIC_IMPLICATION;\n case '∨':\n return TokenID.LOGIC_OR;\n case '&':\n return TokenID.LOGIC_AND;\n\n case '∀':\n return TokenID.QUANTOR_UNIVERSAL;\n case '∃':\n return TokenID.QUANTOR_EXISTS;\n }\n return TokenID.ERROR;\n}\n\nfunction processParenthesis(node: AstNode) {\n promoteSingleChild(node, 1);\n node.parenthesis = true;\n}\n\nfunction processLeftEnum(node: AstNode) {\n if (node.children[0].typeID === node.typeID) {\n for (const child of node.children[0].children) {\n child.parent = node;\n }\n node.children = [...node.children[0].children, node.children[2]];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n}\n\nfunction processDecartChildren(node: AstNode) {\n const newChildren: AstNode[] = [];\n if (node.children[0].typeID === TokenID.DECART && !node.children[0].parenthesis) {\n for (const child of node.children[0].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[0]);\n }\n\n if (node.children[2].typeID === TokenID.DECART && !node.children[2].parenthesis) {\n for (const child of node.children[2].children) {\n child.parent = node;\n newChildren.push(child);\n }\n } else {\n newChildren.push(node.children[2]);\n }\n node.children = newChildren;\n}\n\nfunction processTextFunction(node: AstNode) {\n if (node.children[0].typeID === TokenID.ID_FUNCTION || node.children[0].typeID === TokenID.ID_PREDICATE) {\n node.typeID = TokenID.NT_FUNC_CALL;\n clearData(node);\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n }\n node.children = [node.children[0], ...node.children[2].children];\n } else {\n node.children = [node.children[0], node.children[2]];\n }\n } else {\n node.typeID = node.children[0].typeID;\n node.data = node.children[0].data;\n node.children = [node.children[2]];\n }\n}\n\nfunction processFilter(node: AstNode) {\n const children: AstNode[] = [];\n if (node.children[2].typeID === Expr_enum_min2) {\n for (const child of node.children[2].children) {\n child.parent = node;\n children.push(child);\n }\n } else {\n children.push(node.children[2]);\n }\n children.push(node.children[5]);\n promoteSingleChild(node);\n node.children = children;\n}\n","/**\n * Module: Syntactic errors reporting.\n */\n\nimport { type AstNode, visitAstDFS } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode, type RSErrorDescription } from '../error';\n\nimport { Variable } from './parser.terms';\nimport { TokenID } from './token';\n\nexport function extractSyntaxErrors(\n ast: AstNode,\n expression: string,\n reporter: ErrorReporter,\n annotateErrors: boolean = false\n) {\n const bracketError = extractBracketErrors(expression);\n if (bracketError !== null) {\n reporter(bracketError);\n if (annotateErrors) {\n annotateError(ast, bracketError.code, bracketError.params);\n }\n }\n const hasBracketErrors = bracketError !== null;\n visitAstDFS(ast, node => extractInternal(node, reporter, annotateErrors, hasBracketErrors));\n}\n\n// ====== Internals =========\nfunction extractInternal(\n node: AstNode,\n reporter: ErrorReporter,\n annotateErrors: boolean,\n ignoreUnknownErrors: boolean\n) {\n if (node.typeID !== TokenID.ERROR) {\n return;\n }\n\n function emit(target: AstNode, code: RSErrorCode) {\n reporter({ code: code, from: target.from, to: target.to });\n if (annotateErrors) {\n annotateError(target, code);\n }\n }\n\n const parent = node.parent;\n if (parent === null) {\n if (!ignoreUnknownErrors) {\n return emit(node, RSErrorCode.unknownSyntax);\n }\n return;\n }\n\n if (parent.typeID === Variable) {\n return emit(parent, RSErrorCode.expectedLocal);\n }\n\n if (!ignoreUnknownErrors) {\n emit(node.from === node.to ? parent : node, RSErrorCode.unknownSyntax);\n }\n}\n\ntype OpenBracket = '(' | '[' | '{';\ntype CloseBracket = ')' | ']' | '}';\n\ninterface BracketFrame {\n bracket: OpenBracket;\n index: number;\n}\n\nfunction extractBracketErrors(expression: string): RSErrorDescription | null {\n const stack: BracketFrame[] = [];\n\n for (let pos = 0; pos < expression.length; pos++) {\n const symbol = expression[pos];\n if (isOpenBracket(symbol)) {\n if (isDoubleParenthesis(expression, pos)) {\n return {\n code: RSErrorCode.doubleParenthesis,\n from: pos,\n to: pos + 2\n };\n }\n stack.push({ bracket: symbol, index: pos });\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n\n const expectedOpen = closeToOpen(symbol);\n const top = stack[stack.length - 1];\n if (top === undefined) {\n return {\n code: RSErrorCode.missingOpenBracket,\n from: pos,\n to: pos + 1,\n params: [expectedOpen]\n };\n }\n\n if (top.bracket !== expectedOpen) {\n return {\n code: RSErrorCode.bracketMismatch,\n from: pos,\n to: pos + 1,\n params: [openToClose(top.bracket), symbol]\n };\n }\n\n stack.pop();\n }\n\n if (stack.length > 0) {\n const unclosed = stack[0];\n const code = missingBracketCode(unclosed.bracket);\n return {\n code,\n from: expression.length,\n to: expression.length\n };\n }\n\n return null;\n}\n\nfunction missingBracketCode(bracket: OpenBracket): RSErrorCode {\n switch (bracket) {\n case '(':\n return RSErrorCode.missingParenthesis;\n case '[':\n return RSErrorCode.missingSquareBracket;\n case '{':\n return RSErrorCode.missingCurlyBrace;\n }\n}\n\nfunction isOpenBracket(symbol: string): symbol is OpenBracket {\n return symbol === '(' || symbol === '[' || symbol === '{';\n}\n\nfunction isCloseBracket(symbol: string): symbol is CloseBracket {\n return symbol === ')' || symbol === ']' || symbol === '}';\n}\n\nfunction openToClose(symbol: OpenBracket): CloseBracket {\n switch (symbol) {\n case '(':\n return ')';\n case '[':\n return ']';\n case '{':\n return '}';\n }\n}\n\nfunction closeToOpen(symbol: CloseBracket): OpenBracket {\n switch (symbol) {\n case ')':\n return '(';\n case ']':\n return '[';\n case '}':\n return '{';\n }\n}\n\nfunction isDoubleParenthesis(expression: string, pos: number): boolean {\n const isOpenDoubleParenthesis = expression[pos] === '(' && expression[pos + 1] === '(';\n if (!isOpenDoubleParenthesis) {\n return false;\n }\n\n const outerClose = findMatchingCloseBracket(expression, pos);\n const innerClose = findMatchingCloseBracket(expression, pos + 1);\n if (outerClose < 0 || innerClose < 0) {\n return false;\n }\n\n return outerClose === innerClose + 1;\n}\n\nfunction findMatchingCloseBracket(expression: string, openPos: number): number {\n if (expression[openPos] !== '(') {\n return -1;\n }\n\n const stack: OpenBracket[] = [];\n for (let index = openPos; index < expression.length; index++) {\n const symbol = expression[index];\n if (isOpenBracket(symbol)) {\n stack.push(symbol);\n continue;\n }\n if (!isCloseBracket(symbol)) {\n continue;\n }\n const top = stack.pop();\n if (top === undefined || top !== closeToOpen(symbol)) {\n return -1;\n }\n if (stack.length === 0) {\n return index;\n }\n }\n\n return -1;\n}\n","import { type AstNodeBase } from '../parsing';\n\nimport { TokenID } from './parser/token';\nimport { type ExpressionType, TypeID } from './semantic/typification';\n\nconst INTEGER_TYPE_NAME = 'Z';\nconst ANY_TYPE_NAME = 'R0';\nconst LOGIC_TYPE_NAME = 'Logic';\n\nconst labelTokenRecord: Partial<Record<TokenID, string>> = {\n [TokenID.DECART]: '×',\n [TokenID.PUNCTUATION_PL]: '( )',\n [TokenID.PUNCTUATION_SL]: '[ ]',\n [TokenID.QUANTOR_UNIVERSAL]: '∀',\n [TokenID.QUANTOR_EXISTS]: '∃',\n [TokenID.LOGIC_NOT]: '¬',\n [TokenID.LOGIC_AND]: '&',\n [TokenID.LOGIC_OR]: '∨',\n [TokenID.LOGIC_IMPLICATION]: '⇒',\n [TokenID.LOGIC_EQUIVALENT]: '⇔',\n [TokenID.LIT_EMPTYSET]: '∅',\n [TokenID.LIT_WHOLE_NUMBERS]: 'Z',\n [TokenID.MULTIPLY]: '*',\n [TokenID.EQUAL]: '=',\n [TokenID.NOTEQUAL]: '≠',\n [TokenID.GREATER_OR_EQ]: '≥',\n [TokenID.LESSER_OR_EQ]: '≤',\n [TokenID.SET_IN]: '∈',\n [TokenID.SET_NOT_IN]: '∉',\n [TokenID.SUBSET_OR_EQ]: '⊆',\n [TokenID.SUBSET]: '⊂',\n [TokenID.NOT_SUBSET]: '⊄',\n [TokenID.SET_INTERSECTION]: '∩',\n [TokenID.SET_UNION]: '∪',\n [TokenID.SET_MINUS]: '\\\\',\n [TokenID.SET_SYMMETRIC_MINUS]: '∆',\n [TokenID.BOOLEAN]: 'ℬ()',\n [TokenID.NT_DECLARATIVE_EXPR]: 'D{}',\n [TokenID.NT_IMPERATIVE_EXPR]: 'I{}',\n [TokenID.NT_RECURSIVE_FULL]: 'R{}',\n [TokenID.BIGPR]: 'Pr1()',\n [TokenID.SMALLPR]: 'pr1()',\n [TokenID.FILTER]: 'Fi1[]()',\n [TokenID.REDUCE]: 'red()',\n [TokenID.CARD]: 'card()',\n [TokenID.BOOL]: 'bool()',\n [TokenID.DEBOOL]: 'debool()',\n [TokenID.ASSIGN]: ':=',\n [TokenID.ITERATE]: ':∈'\n};\n\n/** Retrieves label for {@link TokenID}. */\nexport function labelToken(id: TokenID): string {\n const text = labelTokenRecord[id];\n return text ?? 'UNKNOWN TOKEN: ' + String(id);\n}\n\n/** Generates label for {@link AstNodeBase}. */\nexport function labelRSLangNode(node: AstNodeBase): string {\n // prettier-ignore\n switch (node.typeID) {\n case TokenID.ERROR: return '[ERROR]';\n case TokenID.ID_LOCAL:\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n case TokenID.ID_RADICAL:\n return node.data.value as string;\n\n case TokenID.LIT_INTEGER: return String(node.data.value);\n\n case TokenID.BIGPR: return 'Pr' + (node.data.value as string[]).toString();\n case TokenID.SMALLPR: return 'pr' + (node.data.value as string[]).toString();\n case TokenID.FILTER: return 'Fi' + (node.data.value as string[]).toString();\n\n case TokenID.NT_DECLARATIVE_EXPR: return 'DECLARATIVE';\n case TokenID.NT_IMPERATIVE_EXPR: return 'IMPERATIVE';\n case TokenID.NT_RECURSIVE_FULL: return 'RECURSIVE';\n case TokenID.NT_RECURSIVE_SHORT: return 'RECURSIVE';\n\n case TokenID.BOOLEAN: return 'ℬ';\n case TokenID.REDUCE: return 'red';\n case TokenID.CARD: return 'card';\n case TokenID.BOOL: return 'bool';\n case TokenID.DEBOOL: return 'debool';\n\n case TokenID.PLUS: return '+';\n case TokenID.MINUS: return '-';\n case TokenID.MULTIPLY: return '*';\n case TokenID.GREATER: return '>';\n case TokenID.LESSER: return '<';\n\n case TokenID.NT_TUPLE: return 'TUPLE';\n case TokenID.NT_ENUMERATION: return 'ENUM';\n\n case TokenID.NT_ENUM_DECL: return 'ENUM_DECLARE';\n case TokenID.NT_TUPLE_DECL: return 'TUPLE_DECLARE';\n case TokenID.PUNCTUATION_DEFINE: return 'DEFINITION';\n case TokenID.PUNCTUATION_STRUCT: return 'STRUCTURE_DEFINE';\n\n case TokenID.NT_ARG_DECL: return 'ARG';\n case TokenID.NT_FUNC_CALL: return 'CALL';\n case TokenID.NT_ARGUMENTS: return 'ARGS';\n\n case TokenID.NT_FUNC_DEFINITION: return 'FUNCTION_DEFINE';\n\n case TokenID.DECART:\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n case TokenID.LOGIC_NOT:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n case TokenID.LIT_EMPTYSET:\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.SUBSET:\n case TokenID.NOT_SUBSET:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_UNION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.ASSIGN:\n case TokenID.ITERATE:\n return labelToken(node.typeID);\n }\n if (node.data.value) {\n return node.data.value as string;\n }\n return 'UNKNOWN NODE: ' + String(node.typeID);\n}\n\n/** Converts expression type to string. */\nexport function labelType(type: ExpressionType | null): string {\n if (!type) {\n return 'N/A';\n }\n switch (type.typeID) {\n case TypeID.anyTypification:\n return ANY_TYPE_NAME;\n case TypeID.integer:\n return INTEGER_TYPE_NAME;\n case TypeID.basic:\n return type.baseID;\n case TypeID.tuple:\n return type.factors\n .map(factor => (factor.typeID === TypeID.tuple ? `(${labelType(factor)})` : labelType(factor)))\n .join('×');\n case TypeID.collection:\n return type.base.typeID === TypeID.collection ? `ℬ${labelType(type.base)}` : `ℬ(${labelType(type.base)})`;\n case TypeID.logic:\n return LOGIC_TYPE_NAME;\n case TypeID.predicate:\n case TypeID.function:\n const argsText = type.args.map(arg => labelType(arg.type)).join(', ');\n return `[${argsText}] → ${labelType(type.result)}`;\n }\n}\n\n/** Converts expression type to normalized string. */\nexport function normalizeType(type: ExpressionType | null): string {\n if (!type) {\n return 'N/A';\n }\n switch (type.typeID) {\n case TypeID.anyTypification:\n return ANY_TYPE_NAME;\n case TypeID.integer:\n case TypeID.basic:\n return 'X1';\n case TypeID.tuple:\n return type.factors\n .map(factor => (factor.typeID === TypeID.tuple ? `(${normalizeType(factor)})` : normalizeType(factor)))\n .join('×');\n case TypeID.collection:\n return type.base.typeID === TypeID.collection ? `ℬ${normalizeType(type.base)}` : `ℬ(${normalizeType(type.base)})`;\n case TypeID.logic:\n return LOGIC_TYPE_NAME;\n case TypeID.predicate:\n case TypeID.function:\n const argsText = type.args.map(arg => normalizeType(arg.type)).join(', ');\n return `[${argsText}] → ${normalizeType(type.result)}`;\n }\n}\n","/**\n * Module: Typification API for RSLang.\n */\n\nimport {\n bool,\n component,\n type EchelonBase,\n type EchelonCollection,\n type EchelonTuple,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n tuple,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification\n} from './typification';\n\n/** Record map from typeID to typeClass. */\nconst TypeIDToClass: Record<TypeID, TypeClass> = {\n [TypeID.anyTypification]: TypeClass.typification,\n [TypeID.integer]: TypeClass.typification,\n [TypeID.basic]: TypeClass.typification,\n [TypeID.tuple]: TypeClass.typification,\n [TypeID.collection]: TypeClass.typification,\n [TypeID.logic]: TypeClass.logic,\n [TypeID.function]: TypeClass.function,\n [TypeID.predicate]: TypeClass.predicate\n};\n\n/** Returns the TypeClass associated with the given TypeID. */\nexport function getTypeClass(typeID: TypeID): TypeClass {\n return TypeIDToClass[typeID];\n}\n\n/** Returns true if the given typification is generic. */\nexport function hasGenerics(type: Typification): boolean {\n switch (type.typeID) {\n case TypeID.anyTypification:\n return true;\n case TypeID.integer:\n return false;\n case TypeID.basic:\n return isRadical(type.baseID);\n case TypeID.collection:\n return hasGenerics(type.base);\n case TypeID.tuple:\n for (const factor of type.factors) {\n if (hasGenerics(factor)) {\n return true;\n }\n }\n return false;\n }\n}\n\n/** Checks if two typifications are equal. */\nexport function checkEquality(type1: Typification, type2: Typification): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.anyTypification:\n return true;\n case TypeID.basic:\n return type1.baseID === (type2 as EchelonBase).baseID;\n case TypeID.collection:\n return checkEquality(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple: {\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkEquality(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Merge two types to get result of binary operation. */\nexport function mergeTypifications(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2) ? type2 : null;\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1) ? type1 : null;\n }\n\n switch (type1.typeID) {\n case TypeID.integer:\n case TypeID.basic:\n return commonType(type1, type2);\n case TypeID.collection:\n if (type2.typeID !== TypeID.collection) {\n return null;\n }\n const base = mergeTypifications(type1.base, type2.base);\n return base ? bool(base) : null;\n case TypeID.tuple:\n if (type2.typeID !== TypeID.tuple) {\n return null;\n }\n if (type1.factors.length !== type2.factors.length) {\n return null;\n }\n const components: Typification[] = [];\n for (let index = 0; index < type1.factors.length; ++index) {\n const component = mergeTypifications(type1.factors[index], type2.factors[index]);\n if (component === null) {\n return null;\n }\n components.push(component);\n }\n return tuple(components);\n }\n}\n\n/** Check compatibility of typifications. */\nexport function checkCompatibility(type1: ExpressionType, type2: ExpressionType): boolean {\n if (type1 === type2) {\n return true;\n }\n if (type1.typeID === TypeID.anyTypification) {\n return isTypification(type2);\n }\n if (type2.typeID === TypeID.anyTypification) {\n return isTypification(type1);\n }\n if (isTypification(type1) !== isTypification(type2)) {\n return false;\n }\n if (\n type1.typeID === TypeID.integer ||\n type1.typeID === TypeID.basic ||\n type2.typeID === TypeID.integer ||\n type2.typeID === TypeID.basic\n ) {\n return commonType(type1 as Typification, type2 as Typification) !== null;\n }\n\n if (type1.typeID !== type2.typeID) {\n return false;\n }\n switch (type1.typeID) {\n case TypeID.collection:\n return checkCompatibility(type1.base, (type2 as EchelonCollection).base);\n case TypeID.tuple:\n if (type1.factors.length !== (type2 as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < type1.factors.length; ++index) {\n if (!checkCompatibility(type1.factors[index], (type2 as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n case TypeID.logic:\n case TypeID.predicate:\n case TypeID.function:\n return false;\n }\n}\n\n/** Compare typification with substitutions. */\nexport function compareTemplated(\n substitutes: Map<string, Typification>,\n arg: Typification,\n value: Typification\n): boolean {\n if (arg === value) {\n return true;\n }\n if (arg.typeID === TypeID.basic && isRadical(arg.baseID)) {\n if (!substitutes.has(arg.baseID)) {\n substitutes.set(arg.baseID, value);\n return true;\n } else {\n const mergeType = mergeTypifications(substitutes.get(arg.baseID)!, value);\n if (mergeType === null) {\n return false;\n }\n substitutes.set(arg.baseID, mergeType);\n return true;\n }\n }\n if (value.typeID === TypeID.anyTypification) {\n return true;\n }\n if (\n arg.typeID === TypeID.integer ||\n arg.typeID === TypeID.basic ||\n value.typeID === TypeID.integer ||\n value.typeID === TypeID.basic\n ) {\n return commonType(arg, value) !== null;\n }\n if (arg.typeID !== value.typeID) {\n return false;\n }\n switch (arg.typeID) {\n case TypeID.collection:\n return compareTemplated(substitutes, arg.base, (value as EchelonCollection).base);\n case TypeID.tuple: {\n if (arg.factors.length !== (value as EchelonTuple).factors.length) {\n return false;\n }\n for (let index = 0; index < arg.factors.length; ++index) {\n if (!compareTemplated(substitutes, arg.factors[index], (value as EchelonTuple).factors[index])) {\n return false;\n }\n }\n return true;\n }\n }\n}\n\n/** Apply substitutions to typification. */\nexport function substituteBase(target: Typification, substitutes: Map<string, Typification>): void {\n switch (target.typeID) {\n case TypeID.basic: {\n if (substitutes.has(target.baseID)) {\n Object.assign(target, substitutes.get(target.baseID)!);\n }\n return;\n }\n case TypeID.collection: {\n substituteBase(target.base, substitutes);\n return;\n }\n case TypeID.tuple: {\n for (const factor of target.factors) {\n substituteBase(factor, substitutes);\n }\n return;\n }\n }\n}\n\n/** Extract bases from typification. */\nexport function extractBases(target: ExpressionType): Set<string> {\n return new Set(extractBasesImpl(target));\n}\n\n/** Apply type path to typification. */\nexport function applyPath(target: Typification, path: TypePath, index = 0): Typification | null {\n let current: Typification | null = target;\n let i = index;\n while (i < path.length && current) {\n switch (current.typeID) {\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return null;\n case TypeID.collection:\n current = current.base;\n i++;\n break;\n case TypeID.tuple:\n current = component(current, path[i]);\n if (current === null) {\n return null;\n }\n i++;\n break;\n }\n }\n return current;\n}\n\n// ===== Internals =====\nfunction commonType(type1: Typification, type2: Typification): Typification | null {\n if (type1 === type2) {\n return type1;\n }\n const int1 = 'isIntegerCompatible' in type1 && type1.isIntegerCompatible;\n const int2 = 'isIntegerCompatible' in type2 && type2.isIntegerCompatible;\n if (!int1 || !int2) {\n if (type1.typeID === TypeID.basic && type2.typeID === TypeID.basic) {\n return type1.baseID === type2.baseID ? type1 : null;\n }\n return null;\n }\n if (type1.typeID === TypeID.integer) {\n return type2;\n } else if (type2.typeID === TypeID.integer) {\n return type1;\n } else {\n return IntegerT;\n }\n}\n\nfunction extractBasesImpl(target: ExpressionType): string[] {\n switch (target.typeID) {\n case TypeID.basic:\n return [target.baseID];\n case TypeID.collection:\n return extractBasesImpl(target.base);\n case TypeID.tuple:\n return target.factors.reduce((result, factor) => result.concat(extractBasesImpl(factor)), [] as string[]);\n case TypeID.function:\n const result = extractBasesImpl(target.result);\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), result);\n case TypeID.predicate:\n return target.args.reduce((result, arg) => result.concat(extractBasesImpl(arg.type)), [] as string[]);\n default:\n return [];\n }\n}\n","/**\n * Module: Type auditor for AST type checking.\n */\n\nimport { type AstNode, getNodeIndices, getNodeText } from '../../parsing';\nimport { annotateError, annotateType } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { labelRSLangNode, labelToken, labelType } from '../labels';\nimport { TokenID } from '../parser/token';\n\nimport {\n type Argument,\n bool,\n component,\n debool,\n type EchelonTuple,\n EmptySetT,\n type ExpressionType,\n IntegerT,\n isRadical,\n isTypification,\n LogicT,\n type Parametrized,\n tuple,\n type TypeContext,\n TypeID,\n type Typification\n} from './typification';\nimport {\n checkCompatibility,\n checkEquality,\n compareTemplated,\n hasGenerics,\n mergeTypifications,\n substituteBase\n} from './typification-api';\n\n/** Type auditor for AST type checking. */\nexport class TypeAuditor {\n private static readonly TYPE_DEDUCTION_DEPTH = 5;\n\n private context: TypeContext;\n private reporter?: ErrorReporter;\n private locals: LocalContext;\n private annotateTypes: boolean;\n private annotateErrors: boolean;\n\n constructor(context: TypeContext) {\n this.annotateTypes = false;\n this.annotateErrors = false;\n this.context = context;\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n public run(\n ast: AstNode,\n annotateTypes: boolean,\n reporter?: ErrorReporter,\n annotateErrors: boolean = false\n ): ExpressionType | null {\n if (ast.hasError) {\n return null;\n }\n this.annotateTypes = annotateTypes;\n this.annotateErrors = annotateErrors;\n this.reporter = reporter;\n this.clear();\n return this.dispatchVisit(ast);\n }\n\n private clear(): void {\n this.locals = new LocalContext(this.onError.bind(this));\n }\n\n private dispatchDeclare(node: AstNode, domain: Typification): boolean {\n const result = this.processDeclare(node, domain);\n if (result === true && this.annotateTypes) {\n annotateType(node, domain);\n }\n return result;\n }\n\n private processDeclare(node: AstNode, domain: Typification): boolean {\n switch (node.typeID) {\n case TokenID.ID_LOCAL:\n return this.declareLocal(node, domain);\n case TokenID.NT_TUPLE_DECL:\n return this.declareTuple(node, domain);\n case TokenID.NT_ENUM_DECL:\n return this.declareEnumeration(node, domain);\n }\n return false;\n }\n\n private declareLocal(node: AstNode, domain: Typification): boolean {\n return this.locals.pushLocal(node, domain);\n }\n\n private declareTuple(node: AstNode, domain: Typification): boolean {\n if (domain.typeID !== TypeID.tuple || domain.factors.length !== node.children.length) {\n this.onError(RSErrorCode.invalidCortegeDeclare, node.children[0]);\n return false;\n }\n for (let child = 0; child < node.children.length; child++) {\n if (!this.visitChildDeclaration(node, child, component(domain, child + 1)!)) {\n return false;\n }\n }\n return true;\n }\n\n private declareEnumeration(node: AstNode, domain: Typification): boolean {\n for (const child of node.children) {\n if (!this.dispatchDeclare(child, domain)) {\n return false;\n }\n }\n return true;\n }\n\n private dispatchVisit(node: AstNode): ExpressionType | null {\n const result = this.processVisit(node);\n if (result !== null && this.annotateTypes) {\n annotateType(node, result);\n }\n return result;\n }\n\n private processVisit(node: AstNode): ExpressionType | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n return this.visitLocal(node);\n case TokenID.ID_RADICAL:\n return this.visitRadical(node);\n\n case TokenID.LIT_INTEGER:\n return IntegerT;\n case TokenID.LIT_WHOLE_NUMBERS:\n return bool(IntegerT);\n case TokenID.LIT_EMPTYSET:\n return this.visitEmptySet(node);\n\n case TokenID.NT_ARGUMENTS:\n return this.visitArgumentsEnum(node);\n case TokenID.NT_ARG_DECL:\n return this.visitArgument(node);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitArithmetic(node);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n return this.visitNegation(node);\n\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitLogicBinary(node);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.visitEquals(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitIntegerPredicate(node);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n return this.visitTuple(node);\n case TokenID.NT_ENUMERATION:\n return this.visitEnumeration(node);\n\n case TokenID.BIGPR:\n return this.visitProjectSet(node);\n case TokenID.SMALLPR:\n return this.visitProjectTuple(node);\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n return this.visitCard(node);\n case TokenID.REDUCE:\n return this.visitReduce(node);\n case TokenID.BOOL:\n return this.visitBool(node);\n case TokenID.DEBOOL:\n return this.visitDebool(node);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.ITERATE:\n return this.visitIterate(node);\n case TokenID.ASSIGN:\n return this.visitAssign(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.visitRecursion(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ExpressionType | null {\n if (index >= node.children.length) {\n return null;\n }\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitChildDeclaration(node: AstNode, index: number, domain: Typification): boolean {\n if (index >= node.children.length) {\n return false;\n }\n if (!this.dispatchDeclare(node.children[index], domain)) {\n return false;\n }\n return true;\n }\n\n private visitAllAndReturn(node: AstNode, type: ExpressionType | null): ExpressionType | null {\n for (const child of node.children) {\n if (!this.dispatchVisit(child)) {\n return null;\n }\n }\n return type;\n }\n\n private childTypification(node: AstNode, index: number): Typification | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (!isTypification(result)) {\n this.onError(RSErrorCode.expectedSetexpr, node.children[index], [labelType(result)]);\n return null;\n }\n return result as Typification;\n }\n\n private childLogic(node: AstNode, index: number): boolean {\n const result = this.visitChild(node, index);\n if (result === null) {\n return false;\n }\n if (result.typeID !== TypeID.logic) {\n this.onError(RSErrorCode.expectedLogic, node.children[index], [labelType(result)]);\n return false;\n }\n return true;\n }\n\n private childTypeDebool(node: AstNode, index: number, errorCode: RSErrorCode): Typification | null {\n const result = this.childTypification(node, index);\n if (result === null) {\n return null;\n }\n if (result.typeID === TypeID.anyTypification) {\n return result;\n }\n if (result.typeID !== TypeID.collection) {\n this.onError(errorCode, node.children[index], [labelType(result)]);\n return null;\n }\n return debool(result);\n }\n\n private visitLocal(node: AstNode): ExpressionType | null {\n return this.locals.getLocalType(node);\n }\n\n private visitGlobal(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n const type = this.context.get(alias);\n if (!type) {\n return this.onError(RSErrorCode.globalNotTyped, node, [alias]);\n }\n return type;\n }\n\n private visitFunctionDefinition(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n if (!this.visitChild(node, 0)) {\n return null;\n }\n\n const args: Argument[] = [];\n for (const local of this.locals.data) {\n if (local.level === 1) {\n args.push({ alias: local.alias, type: local.type });\n }\n }\n\n const result = this.visitChild(node, 1);\n if (result === null || result.typeID === TypeID.function || result.typeID === TypeID.predicate) {\n return null;\n }\n this.locals.endScope(node.children[1]);\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: result,\n args: args\n };\n } else {\n return {\n typeID: TypeID.function,\n result: result,\n args: args\n };\n }\n }\n\n private visitFunctionCall(node: AstNode): ExpressionType | null {\n const funcName = getNodeText(node.children[0]);\n const funcType = this.context.get(funcName);\n if (funcType?.typeID !== TypeID.function && funcType?.typeID !== TypeID.predicate) {\n return this.onError(RSErrorCode.globalNotTyped, node.children[0], [funcName]);\n }\n if (this.annotateTypes) {\n annotateType(node.children[0], funcType);\n }\n\n const substitutes = this.checkFuncArguments(node, funcName, funcType);\n if (substitutes === null) {\n return null;\n }\n if (funcType.result.typeID === TypeID.logic) {\n return funcType.result;\n } else {\n const result = mangleRadicals(funcName, funcType.result);\n if (substitutes.size > 0) {\n substituteBase(result, substitutes);\n }\n return result;\n }\n }\n\n private visitRadical(node: AstNode): ExpressionType | null {\n const alias = getNodeText(node);\n if (!this.isInsideFuncArgument(node)) {\n return this.onError(RSErrorCode.radicalUsage, node, [alias]);\n }\n return bool({ typeID: TypeID.basic, baseID: alias });\n }\n\n private visitEmptySet(node: AstNode): ExpressionType | null {\n const invalidParents: TokenID[] = [\n TokenID.CARD,\n TokenID.DEBOOL,\n TokenID.SET_UNION,\n TokenID.SET_INTERSECTION,\n TokenID.SET_MINUS,\n TokenID.SET_SYMMETRIC_MINUS,\n TokenID.REDUCE,\n TokenID.BIGPR,\n TokenID.SMALLPR\n ];\n if (invalidParents.includes(node.parent?.typeID as TokenID)) {\n return this.onError(RSErrorCode.invalidEmptySetUsage, node);\n }\n return EmptySetT;\n }\n\n private visitArgument(node: AstNode): ExpressionType | null {\n const variable = node.children[0];\n if (variable.typeID === TokenID.NT_TUPLE_DECL) {\n return this.onError(RSErrorCode.invalidArgumentCortegeDeclare, variable);\n }\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return domain;\n }\n\n private visitCard(node: AstNode): ExpressionType | null {\n if (!this.childTypeDebool(node, 0, RSErrorCode.invalidCard)) {\n return null;\n }\n return IntegerT;\n }\n\n private visitArithmetic(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isArithmetic' in type1 && type1.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[0], [labelType(type1)]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isArithmetic' in type2 && type2.isArithmetic)) {\n return this.onError(RSErrorCode.arithmeticNotSupported, node.children[1], [labelType(type2)]);\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return result;\n }\n\n private visitIntegerPredicate(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n if (!('isOrdered' in type1 && type1.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[0], [labelType(type1)]);\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!('isOrdered' in type2 && type2.isOrdered)) {\n return this.onError(RSErrorCode.orderingNotSupported, node.children[1], [labelType(type2)]);\n }\n\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitQuantifier(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return LogicT;\n }\n\n private visitNegation(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0)) {\n return null;\n }\n return LogicT;\n }\n\n private visitLogicBinary(node: AstNode): ExpressionType | null {\n if (!this.childLogic(node, 0) || !this.childLogic(node, 1)) {\n return null;\n }\n return LogicT;\n }\n\n private visitEquals(node: AstNode): ExpressionType | null {\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypification(node, 1);\n if (type2 === null) {\n return null;\n }\n if (!checkCompatibility(type1, type2)) {\n return this.onError(RSErrorCode.typesNotCompatible, node, [labelType(type1), labelType(type2)]);\n }\n return LogicT;\n }\n\n private visitSetexprPredicate(node: AstNode): ExpressionType | null {\n let type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (type2 === null) {\n return null;\n }\n const isSubset = this.isSubset(node.typeID as TokenID);\n if (isSubset) {\n type2 = bool(type2);\n }\n const type1 = this.childTypification(node, 0);\n if (type1 === null) {\n return null;\n }\n\n if (!checkCompatibility(type1, type2)) {\n if (isSubset) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(type1), labelType(type2)]);\n } else {\n return this.onError(RSErrorCode.invalidElementPredicate, node, [\n labelType(type1),\n labelToken(node.typeID as TokenID),\n labelType(bool(type2))\n ]);\n }\n }\n return LogicT;\n }\n\n private visitDecart(node: AstNode): ExpressionType | null {\n const factors: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypeDebool(node, child, RSErrorCode.invalidDecart);\n if (type === null) {\n return null;\n } else {\n factors.push(type);\n }\n }\n return bool(tuple(factors));\n }\n\n private visitBoolean(node: AstNode): ExpressionType | null {\n const type = this.childTypeDebool(node, 0, RSErrorCode.invalidBoolean);\n if (type === null) {\n return null;\n }\n return bool(bool(type));\n }\n\n private visitTuple(node: AstNode): ExpressionType | null {\n const components: Typification[] = [];\n for (let child = 0; child < node.children.length; child++) {\n const type = this.childTypification(node, child);\n if (type === null) {\n return null;\n }\n components.push(type);\n }\n return tuple(components);\n }\n\n private visitEnumeration(node: AstNode): ExpressionType | null {\n let type: ExpressionType | null = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n\n const merge = mergeTypifications(type, childType);\n if (merge === null) {\n return this.onError(RSErrorCode.invalidEnumeration, node.children[child], [\n labelType(type),\n labelType(childType)\n ]);\n }\n type = merge;\n }\n return bool(type);\n }\n\n private visitBool(node: AstNode): ExpressionType | null {\n return this.visitEnumeration(node);\n }\n\n private visitDebool(node: AstNode): ExpressionType | null {\n return this.childTypeDebool(node, 0, RSErrorCode.invalidDebool);\n }\n\n private visitSetexprBinary(node: AstNode): ExpressionType | null {\n const type1 = this.childTypeDebool(node, 0, RSErrorCode.invalidTypeOperation);\n if (type1 === null) {\n return null;\n }\n\n const type2 = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (type2 === null) {\n return null;\n }\n\n const result = mergeTypifications(type1, type2);\n if (result === null) {\n return this.onError(RSErrorCode.typesNotEqual, node, [labelType(bool(type1)), labelType(bool(type2))]);\n }\n return bool(result);\n }\n\n private visitProjectSet(node: AstNode): ExpressionType | null {\n const argument = this.childTypeDebool(node, 0, RSErrorCode.invalidProjectionSet);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.invalidProjectionSet, node.children[0], [\n labelRSLangNode(node),\n labelType(bool(argument))\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return bool(components[0]);\n } else {\n return bool(tuple(components));\n }\n }\n\n private visitProjectTuple(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (argument.typeID === TypeID.anyTypification) {\n return argument;\n }\n if (argument.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n\n const indices = getNodeIndices(node);\n const components: Typification[] = [];\n for (const index of indices) {\n const newComponent = component(argument, index);\n if (newComponent === null) {\n return this.onError(RSErrorCode.invalidProjectionTuple, node.children[0], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n } else {\n components.push(newComponent);\n }\n }\n if (components.length === 1) {\n return components[0];\n } else {\n return tuple(components);\n }\n }\n\n private visitFilter(node: AstNode): ExpressionType | null {\n const indices = getNodeIndices(node);\n const tupleParam = indices.length === node.children.length - 1;\n if (!tupleParam && node.children.length > 2) {\n return this.onError(RSErrorCode.invalidFilterArity, node);\n }\n\n const argument = this.childTypification(node, node.children.length - 1);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.tuple) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n\n const argBase = debool(argument) as EchelonTuple;\n const bases: Typification[] = [];\n for (const index of indices) {\n const newBase = component(argBase, index);\n if (newBase === null) {\n return this.onError(RSErrorCode.invalidFilterArgumentType, node.children[node.children.length - 1], [\n labelRSLangNode(node),\n labelType(argument)\n ]);\n }\n bases.push(newBase);\n }\n\n if (tupleParam) {\n for (let child = 0; child + 1 < node.children.length; child++) {\n const param = this.childTypification(node, child);\n if (param === null) {\n return null;\n }\n if (param.typeID !== TypeID.collection || !checkCompatibility(bases[child], debool(param))) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[child], [\n labelType(param),\n labelType(bool(bases[child]))\n ]);\n }\n }\n } else {\n const param = this.childTypification(node, 0);\n if (param === null) {\n return null;\n }\n const paramType = param;\n const expected = bool(tuple(bases));\n if (paramType.typeID !== TypeID.collection || !checkCompatibility(expected, paramType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[0], [labelType(paramType), labelType(expected)]);\n }\n }\n return argument;\n }\n\n private visitReduce(node: AstNode): ExpressionType | null {\n const argument = this.childTypification(node, 0);\n if (argument === null) {\n return null;\n }\n if (\n argument.typeID === TypeID.anyTypification ||\n (argument.typeID === TypeID.collection && argument.base.typeID === TypeID.anyTypification)\n ) {\n return EmptySetT;\n }\n if (argument.typeID !== TypeID.collection || argument.base.typeID !== TypeID.collection) {\n return this.onError(RSErrorCode.invalidReduce, node.children[0], [labelType(argument)]);\n }\n return debool(argument);\n }\n\n private visitArgumentsEnum(node: AstNode): ExpressionType | null {\n return this.visitAllAndReturn(node, LogicT);\n }\n\n private visitDeclarative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n } else if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n } else if (!this.childLogic(node, 2)) {\n return null;\n }\n\n this.locals.endScope(node.children[2]);\n return bool(domain);\n }\n\n private visitImperative(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n for (let child = 1; child < node.children.length; child++) {\n if (!this.childLogic(node, child)) {\n return null;\n }\n }\n\n const type = this.childTypification(node, 0);\n if (type === null) {\n return null;\n }\n\n this.locals.endScope(node);\n return bool(type);\n }\n\n private visitIterate(node: AstNode): ExpressionType | null {\n const domain = this.childTypeDebool(node, 1, RSErrorCode.invalidTypeOperation);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitAssign(node: AstNode): ExpressionType | null {\n const domain = this.childTypification(node, 1);\n if (domain === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, domain)) {\n return null;\n }\n return LogicT;\n }\n\n private visitRecursion(node: AstNode): ExpressionType | null {\n this.locals.startScope();\n\n const initType = this.childTypification(node, 1);\n if (initType === null) {\n return null;\n }\n if (!this.visitChildDeclaration(node, 0, initType)) {\n return null;\n }\n\n const isFull = node.typeID === TokenID.NT_RECURSIVE_FULL;\n const iterationIndex = isFull ? 3 : 2;\n\n let iterationValue = this.childTypification(node, iterationIndex);\n if (iterationValue === null) {\n return null;\n }\n if (!checkCompatibility(iterationValue, initType)) {\n return this.onError(RSErrorCode.typesNotEqual, node.children[iterationIndex], [\n labelType(iterationValue),\n labelType(initType)\n ]);\n }\n\n if (hasGenerics(initType)) {\n for (let retries = TypeAuditor.TYPE_DEDUCTION_DEPTH; retries > 0; retries--) {\n this.locals.endScope(node);\n this.locals.clearUnused();\n this.locals.startScope();\n if (!this.visitChildDeclaration(node, 0, iterationValue)) {\n return null;\n }\n const newIteration = this.childTypification(node, iterationIndex);\n if (newIteration === null) {\n return null;\n }\n if (checkEquality(newIteration, iterationValue)) {\n break;\n }\n iterationValue = newIteration;\n }\n }\n\n if (isFull) {\n if (!this.childLogic(node, 2)) {\n return null;\n }\n }\n\n this.locals.endScope(node);\n return iterationValue;\n }\n\n private isSubset(token: TokenID): boolean {\n return token === TokenID.SUBSET || token === TokenID.SUBSET_OR_EQ || token === TokenID.NOT_SUBSET;\n }\n\n private isInsideFuncArgument(node: AstNode): boolean {\n while (node.parent && node.parent !== node) {\n if (node.typeID === TokenID.NT_ARGUMENTS) return true;\n node = node.parent;\n }\n return false;\n }\n\n private checkFuncArguments(node: AstNode, alias: string, type: Parametrized): Map<string, Typification> | null {\n if (node.children.length - 1 !== type.args.length) {\n return this.onError(RSErrorCode.invalidArgsArity, node.children[1], [\n String(type.args.length),\n String(node.children.length - 1)\n ]);\n }\n\n const substitutes = new Map<string, Typification>();\n for (let child = 1; child < node.children.length; child++) {\n const childType = this.childTypification(node, child);\n if (childType === null) {\n return null;\n }\n const argType = mangleRadicals(alias, type.args[child - 1].type);\n if (!compareTemplated(substitutes, argType, childType)) {\n this.onError(RSErrorCode.invalidArgumentType, node.children[child], [\n `${type.args[child - 1].alias}∈${labelType(argType)}`,\n labelType(childType)\n ]);\n return null;\n }\n }\n return substitutes;\n }\n}\n\n// ========= Internals ========\nfunction mangleRadicals(funcName: string, type: Typification): Typification {\n switch (type.typeID) {\n default:\n throw new Error(`Unexpected type: ${type.typeID}`);\n case TypeID.integer:\n return type;\n case TypeID.basic: {\n if (isRadical(type.baseID)) {\n return {\n typeID: type.typeID,\n baseID: type.baseID + funcName\n };\n }\n return type;\n }\n case TypeID.collection: {\n return {\n typeID: type.typeID,\n base: mangleRadicals(funcName, debool(type))\n };\n }\n case TypeID.tuple: {\n const factors: Typification[] = [];\n for (let index = 1; index <= type.factors.length; ++index) {\n factors.push(mangleRadicals(funcName, component(type, index)!));\n }\n return {\n typeID: type.typeID,\n factors: factors\n };\n }\n }\n}\n\n/** Local variable data. */\ninterface LocalData {\n alias: string;\n level: number;\n useCount: number;\n type: Typification;\n}\n\n/** Local variables context. */\nclass LocalContext {\n private onError: (code: RSErrorCode, node: AstNode, params: string[]) => null;\n\n public data: LocalData[] = [];\n\n constructor(onError: (code: RSErrorCode, node: AstNode, params: string[]) => null) {\n this.onError = onError;\n }\n\n startScope(): void {\n for (const local of this.data) {\n if (local.level > 0) {\n local.level = local.level + 1;\n }\n }\n }\n\n endScope(node: AstNode, skipUnused: boolean = false): void {\n for (const local of this.data) {\n local.level--;\n if (!skipUnused && local.level === 0 && local.useCount === 0) {\n this.onError(RSErrorCode.localNotUsed, node, [local.alias]);\n }\n }\n }\n\n clearUnused(): void {\n this.data = this.data.filter(data => data.level > 0);\n }\n\n pushLocal(node: AstNode, type: Typification): boolean {\n const alias = getNodeText(node);\n const existing = this.data.find(data => data.alias === alias);\n if (existing) {\n if (existing.level > 0) {\n this.onError(RSErrorCode.localShadowing, node, [alias]);\n return false;\n } else {\n this.onError(RSErrorCode.localDoubleDeclare, node, [alias]);\n const index = this.data.indexOf(existing);\n if (index !== -1) {\n this.data.splice(index, 1);\n }\n }\n }\n this.data.push({ alias, type, level: 1, useCount: 0 });\n return true;\n }\n\n getLocalType(node: AstNode): Typification | null {\n const alias = getNodeText(node);\n const local = this.data.find(data => data.alias === alias);\n if (local === undefined) {\n this.onError(RSErrorCode.localUndeclared, node, [alias]);\n return null;\n } else if (local.level < 1) {\n this.onError(RSErrorCode.localOutOfScope, node, [alias]);\n return null;\n } else {\n local.useCount++;\n return local.type;\n }\n }\n}\n","/* Module: Calculation for RSLang. */\n\n/** Represents computability class. */\nexport const ValueClass = {\n VALUE: 'value',\n PROPERTY: 'property'\n} as const;\nexport type ValueClass = (typeof ValueClass)[keyof typeof ValueClass];\n\n/** ValueClass context. */\nexport type ValueClassContext = Map<string, ValueClass>;\n","/**\n * Module: Value auditor for AST value class checking.\n *\n * Determines whether an expression yields a concrete value (computable)\n * or a property (e.g., depends on a quantified variable).\n */\n\nimport { type AstNode, getNodeText } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { type ErrorReporter, RSErrorCode } from '../error';\nimport { TokenID } from '../parser/token';\n\nimport { ValueClass, type ValueClassContext } from './value-class';\n\n/** Value auditor for AST value class checking. */\nexport class ValueAuditor {\n private context: ValueClassContext;\n private annotateErrors: boolean;\n private reporter?: ErrorReporter;\n\n constructor(context: ValueClassContext) {\n this.context = context;\n this.annotateErrors = false;\n }\n\n /**\n * Runs value audit on the AST. Returns the value class on success, null on failure.\n */\n run(ast: AstNode, reporter?: ErrorReporter, annotateErrors: boolean = false): ValueClass | null {\n if (ast.hasError) {\n return null;\n }\n this.reporter = reporter;\n this.annotateErrors = annotateErrors;\n return this.dispatchVisit(ast);\n }\n\n private dispatchVisit(node: AstNode): ValueClass | null {\n switch (node.typeID) {\n case TokenID.ID_GLOBAL:\n case TokenID.ID_FUNCTION:\n case TokenID.ID_PREDICATE:\n return this.visitGlobal(node);\n\n case TokenID.ID_LOCAL:\n case TokenID.ID_RADICAL:\n case TokenID.LIT_INTEGER:\n case TokenID.LIT_EMPTYSET:\n return ValueClass.VALUE;\n\n case TokenID.LIT_WHOLE_NUMBERS:\n return ValueClass.PROPERTY;\n\n case TokenID.NT_TUPLE_DECL:\n case TokenID.NT_ENUM_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.NT_ARGUMENTS:\n case TokenID.NT_ARG_DECL:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.PLUS:\n case TokenID.MINUS:\n case TokenID.MULTIPLY:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.QUANTOR_UNIVERSAL:\n case TokenID.QUANTOR_EXISTS:\n return this.visitQuantifier(node);\n\n case TokenID.LOGIC_NOT:\n case TokenID.LOGIC_AND:\n case TokenID.LOGIC_OR:\n case TokenID.LOGIC_IMPLICATION:\n case TokenID.LOGIC_EQUIVALENT:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.EQUAL:\n case TokenID.NOTEQUAL:\n return this.assertAllValues(node);\n\n case TokenID.GREATER:\n case TokenID.LESSER:\n case TokenID.GREATER_OR_EQ:\n case TokenID.LESSER_OR_EQ:\n return this.visitAllAndReturn(node, ValueClass.VALUE);\n\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET:\n case TokenID.SUBSET_OR_EQ:\n case TokenID.NOT_SUBSET:\n return this.visitSetexprPredicate(node);\n\n case TokenID.DECART:\n return this.visitDecart(node);\n case TokenID.BOOLEAN:\n return this.visitBoolean(node);\n\n case TokenID.NT_TUPLE:\n case TokenID.NT_ENUMERATION:\n return this.assertAllValues(node);\n\n case TokenID.FILTER:\n return this.visitFilter(node);\n\n case TokenID.CARD:\n case TokenID.BOOL:\n case TokenID.DEBOOL:\n case TokenID.BIGPR:\n case TokenID.SMALLPR:\n case TokenID.REDUCE:\n return this.assertChildIsValue(node, 0);\n\n case TokenID.SET_UNION:\n case TokenID.SET_INTERSECTION:\n case TokenID.SET_MINUS:\n case TokenID.SET_SYMMETRIC_MINUS:\n return this.visitSetexprBinary(node);\n\n case TokenID.NT_FUNC_DEFINITION:\n return this.visitFunctionDefinition(node);\n case TokenID.NT_FUNC_CALL:\n return this.visitFunctionCall(node);\n\n case TokenID.NT_DECLARATIVE_EXPR:\n return this.visitDeclarative(node);\n case TokenID.NT_IMPERATIVE_EXPR:\n return this.visitImperative(node);\n\n case TokenID.NT_RECURSIVE_FULL:\n case TokenID.NT_RECURSIVE_SHORT:\n return this.assertAllValues(node);\n\n case TokenID.ITERATE:\n case TokenID.ASSIGN:\n return this.visitIterateOrAssign(node);\n }\n return null;\n }\n\n private onError(code: RSErrorCode, node: AstNode, params?: string[]): null {\n this.reporter?.({ code, from: node.from, to: node.to, params });\n if (this.annotateErrors) {\n annotateError(node, code, params);\n }\n return null;\n }\n\n private visitChild(node: AstNode, index: number): ValueClass | null {\n return this.dispatchVisit(node.children[index]);\n }\n\n private visitAllAndReturn(node: AstNode, value: ValueClass): ValueClass | null {\n for (const child of node.children) {\n if (this.dispatchVisit(child) === null) {\n return null;\n }\n }\n return value;\n }\n\n private assertChildIsValue(node: AstNode, index: number): ValueClass | null {\n const result = this.visitChild(node, index);\n if (result === null) {\n return null;\n }\n if (result !== ValueClass.VALUE) {\n const child = node.children[index];\n return this.onError(RSErrorCode.invalidPropertyUsage, child ?? node);\n }\n return ValueClass.VALUE;\n }\n\n private assertAllValues(node: AstNode): ValueClass | null {\n for (let i = 0; i < node.children.length; i++) {\n if (this.assertChildIsValue(node, i) === null) {\n return null;\n }\n }\n return ValueClass.VALUE;\n }\n\n private visitFunctionDefinition(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitFunctionCall(node: AstNode): ValueClass | null {\n const result = this.visitChild(node, 0);\n if (result === null) {\n return null;\n }\n for (let child = 1; child < node.children.length; child++) {\n if (this.assertChildIsValue(node, child) === null) {\n return null;\n }\n }\n return result;\n }\n\n private visitGlobal(node: AstNode): ValueClass | null {\n const alias = getNodeText(node);\n const result = this.context.get(alias);\n if (!result) {\n return this.onError(RSErrorCode.globalNoValue, node, [alias]);\n }\n return result;\n }\n\n private visitQuantifier(node: AstNode): ValueClass | null {\n if (this.assertChildIsValue(node, 1) === null) {\n return null;\n }\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return ValueClass.VALUE;\n }\n\n private visitSetexprPredicate(node: AstNode): ValueClass | null {\n const tokenId = node.typeID as TokenID;\n switch (tokenId) {\n case TokenID.SET_IN:\n case TokenID.SET_NOT_IN:\n case TokenID.SUBSET_OR_EQ:\n if (this.assertChildIsValue(node, 0) === null) {\n return null;\n }\n if (this.visitChild(node, 1) === null) {\n return null;\n }\n return ValueClass.VALUE;\n\n case TokenID.SUBSET:\n case TokenID.NOT_SUBSET:\n return this.assertAllValues(node);\n }\n return null;\n }\n\n private visitDeclarative(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 2) === null) {\n return null;\n }\n return this.visitChild(node, 1);\n }\n\n private visitImperative(node: AstNode): ValueClass | null {\n for (let child = 1; child < node.children.length; child++) {\n if (this.visitChild(node, child) === null) {\n return null;\n }\n }\n return this.assertChildIsValue(node, 0);\n }\n\n private visitIterateOrAssign(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return this.assertChildIsValue(node, 1);\n }\n\n private visitDecart(node: AstNode): ValueClass | null {\n let result: ValueClass = ValueClass.VALUE;\n for (let child = 0; child < node.children.length; child++) {\n const childClass = this.visitChild(node, child);\n if (childClass === null) {\n return null;\n }\n if (childClass === ValueClass.PROPERTY) {\n result = ValueClass.PROPERTY;\n }\n }\n return result;\n }\n\n private visitBoolean(node: AstNode): ValueClass | null {\n if (this.visitChild(node, 0) === null) {\n return null;\n }\n return ValueClass.PROPERTY;\n }\n\n private visitFilter(node: AstNode): ValueClass | null {\n let last: ValueClass | null = null;\n for (const child of node.children) {\n last = this.dispatchVisit(child);\n if (last === null) {\n return null;\n }\n }\n return last;\n }\n\n private visitSetexprBinary(node: AstNode): ValueClass | null {\n const first = this.visitChild(node, 0);\n if (first === null) {\n return null;\n }\n const second = this.visitChild(node, 1);\n if (second === null) {\n return null;\n }\n const isValue = combineOperationValues(\n node.typeID as TokenID,\n first === ValueClass.VALUE,\n second === ValueClass.VALUE\n );\n return isValue ? ValueClass.VALUE : ValueClass.PROPERTY;\n }\n}\n\n// ====== Internals ======\n\n/** Combines value flags for set operations. */\nfunction combineOperationValues(op: TokenID, v1: boolean, v2: boolean): boolean {\n switch (op) {\n case TokenID.SET_SYMMETRIC_MINUS:\n case TokenID.SET_UNION:\n return v1 && v2;\n case TokenID.SET_INTERSECTION:\n return v1 || v2;\n case TokenID.SET_MINUS:\n return v1;\n default:\n return v1 && v2;\n }\n}\n","import { type AstNode, buildTree } from '../../parsing';\nimport { annotateError } from '../ast-annotations';\nimport { RSErrorCode, type RSErrorDescription } from '../error';\nimport { normalizeAST } from '../parser/normalize';\nimport { parser as rslangParser } from '../parser/parser';\nimport { extractSyntaxErrors } from '../parser/syntax-errors';\nimport { TokenID } from '../parser/token';\n\nimport { TypeAuditor } from './type-auditor';\nimport {\n basic,\n bool,\n constant,\n debool,\n type ExpressionType,\n type TypeClass,\n type TypeContext,\n TypeID\n} from './typification';\nimport { getTypeClass } from './typification-api';\nimport { ValueAuditor } from './value-auditor';\nimport { ValueClass, type ValueClassContext } from './value-class';\n\nexport interface AnalysisBase {\n success: boolean;\n type: ExpressionType | null;\n valueClass: ValueClass | null;\n}\n\nexport interface AnalysisFast extends AnalysisBase {\n ast: AstNode | null;\n}\n\nexport interface AnalysisFull extends AnalysisBase {\n ast: AstNode | null;\n errors: RSErrorDescription[];\n}\n\nexport interface AnalysisOptions {\n expected?: TypeClass;\n isDomain?: boolean;\n annotateTypes?: boolean;\n annotateErrors?: boolean;\n}\n\nexport class RSLangAnalyzer {\n private typeContext: TypeContext = new Map<string, ExpressionType>();\n private valueContext: ValueClassContext = new Map<string, ValueClass>();\n private typeAuditor: TypeAuditor = new TypeAuditor(this.typeContext);\n private valueAuditor: ValueAuditor = new ValueAuditor(this.valueContext);\n\n public addBase(alias: string, isNumeric: boolean = false, valueClass: ValueClass = ValueClass.VALUE): void {\n if (isNumeric) {\n this.typeContext.set(alias, bool(constant(alias)));\n this.valueContext.set(alias, valueClass);\n } else {\n this.typeContext.set(alias, bool(basic(alias)));\n this.valueContext.set(alias, valueClass);\n }\n }\n\n public setGlobal(alias: string, type: ExpressionType | null, value: ValueClass | null): void {\n if (type) {\n this.typeContext.set(alias, type);\n }\n if (value) {\n this.valueContext.set(alias, value);\n }\n }\n\n public getType(alias: string): ExpressionType | null {\n return this.typeContext.get(alias) ?? null;\n }\n\n public checkFast(expression: string, options?: AnalysisOptions): AnalysisFast {\n if (expression.length === 0) {\n return { success: false, type: null, valueClass: null, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, ast: ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n return { success: false, type: null, valueClass: null, ast: ast };\n }\n\n return {\n success: true,\n type: type,\n valueClass: options?.isDomain ? ValueClass.VALUE : this.valueAuditor.run(ast),\n ast: ast\n };\n }\n\n public checkFull(expression: string, options?: AnalysisOptions): AnalysisFull {\n const errors: RSErrorDescription[] = [];\n const reporter = (error: RSErrorDescription) => {\n errors.push(error);\n };\n if (expression.length === 0) {\n reporter({ code: RSErrorCode.cstEmptyDerived, from: 0, to: 0 });\n return { success: false, type: null, valueClass: null, errors: errors, ast: null };\n }\n const ast = this.parse(expression);\n if (ast.hasError) {\n extractSyntaxErrors(ast, expression, reporter, options?.annotateErrors ?? false);\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n const type = this.typeAuditor.run(ast, options?.annotateTypes ?? false, reporter, options?.annotateErrors ?? false);\n if (type === null) {\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n\n if (options?.isDomain) {\n if (!isStructureDomain(ast) || type.typeID !== TypeID.collection) {\n reporter({ code: RSErrorCode.globalStructure, from: ast.from, to: ast.to });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.globalStructure);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n return { success: true, type: debool(type), valueClass: ValueClass.VALUE, errors, ast };\n }\n if (options?.expected && getTypeClass(type.typeID) !== options.expected) {\n reporter({\n code: RSErrorCode.expectedType,\n from: ast.from,\n to: ast.to\n });\n if (options?.annotateErrors) {\n annotateError(ast, RSErrorCode.expectedType);\n }\n return { success: false, type: null, valueClass: null, errors, ast };\n }\n const valueClass = options?.isDomain\n ? ValueClass.VALUE\n : this.valueAuditor.run(ast, reporter, options?.annotateErrors ?? false);\n return { success: true, type, valueClass, errors, ast };\n }\n\n private parse(expression: string): AstNode {\n const tree = rslangParser.parse(expression);\n const ast = buildTree(tree.cursor());\n normalizeAST(ast, expression);\n return ast;\n }\n}\n\n// ======= Internals ========\nfunction isStructureDomain(node: AstNode): boolean {\n switch (node.typeID) {\n case TokenID.LIT_WHOLE_NUMBERS:\n case TokenID.ID_GLOBAL:\n case TokenID.BOOLEAN:\n case TokenID.DECART:\n case TokenID.NT_ENUMERATION:\n break;\n default:\n return false;\n }\n for (const child of node.children) {\n if (!isStructureDomain(child)) {\n return false;\n }\n }\n return true;\n}\n","import {\n bool,\n type ExpressionType,\n IntegerT,\n isTypification,\n LogicT,\n tuple,\n TypeID,\n type Typification\n} from './typification';\n\nexport interface TypificationParseResult {\n type: ExpressionType | null;\n error: string | null;\n}\n\nexport function parseTypeText(input: string): TypificationParseResult {\n const normalized = input.trim().replaceAll('->', '→');\n if (normalized.length === 0) {\n return { type: null, error: null };\n }\n const parser = new TypificationParser(normalized);\n return parser.parse();\n}\n\n/** ASCII substitutions while editing typification text */\nexport function applyAsciiTypeSubstitutions(raw: string): string {\n return raw.replaceAll('->', '→').replaceAll('*', '×').replaceAll('B', 'ℬ');\n}\n\nclass TypificationParser {\n private index = 0;\n private input: string;\n\n constructor(input: string) {\n this.index = 0;\n this.input = input;\n }\n\n parse(): TypificationParseResult {\n try {\n const result = this.parseExpressionType();\n this.skipSpaces();\n if (!this.eof()) {\n throw new Error('Unexpected trailing symbols');\n }\n return { type: result, error: null };\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n return { type: null, error: message };\n }\n }\n\n private parseExpressionType(): ExpressionType {\n this.skipSpaces();\n if (this.peek() === '[') {\n return this.parseCallableType();\n } else {\n return this.parseTypification();\n }\n }\n\n private parseCallableType(): ExpressionType {\n this.expect('[');\n const args: Typification[] = [];\n this.skipSpaces();\n if (this.peek() !== ']') {\n while (true) {\n args.push(this.parseTypification());\n this.skipSpaces();\n if (this.peek() === ',') {\n this.next();\n this.skipSpaces();\n if (this.peek() === ']') {\n throw new Error('Empty argument in callable typification');\n }\n continue;\n }\n break;\n }\n }\n this.expect(']');\n this.skipSpaces();\n this.expect('→');\n const result = this.parseCallableResult();\n if (result.typeID === TypeID.logic) {\n return {\n typeID: TypeID.predicate,\n result: LogicT,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n if (!isTypification(result)) {\n throw new Error('Invalid callable result type');\n }\n return {\n typeID: TypeID.function,\n result: result as Typification,\n args: args.map((arg, index) => ({ alias: `a${index + 1}`, type: arg }))\n };\n }\n\n private parseCallableResult(): ExpressionType {\n this.skipSpaces();\n const lookahead = this.readToken();\n this.index -= lookahead.length;\n if (lookahead === 'Logic') {\n this.index += lookahead.length;\n return LogicT;\n }\n return this.parseTypification();\n }\n\n private parseTypification(): Typification {\n this.skipSpaces();\n if (this.match('ℬ')) {\n this.skipSpaces();\n if (this.peek() === '(') {\n this.next();\n const base = this.parseTypification();\n this.expect(')');\n return bool(base);\n }\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n const base = this.parseTypification();\n return bool(base);\n }\n throw new Error('Expected \"(\" after \"ℬ\"');\n }\n const first = this.parseTypificationAtom();\n const factors: Typification[] = [first];\n while (true) {\n this.skipSpaces();\n if (!this.match('×')) {\n break;\n }\n factors.push(this.parseTypificationAtom());\n }\n if (factors.length === 1) {\n return first;\n }\n return tuple(factors);\n }\n\n private parseTypificationAtom(): Typification {\n this.skipSpaces();\n if (this.input.startsWith('ℬ', this.index)) {\n return this.parseTypification();\n }\n if (this.peek() === '(') {\n this.next();\n const wrapped = this.parseTypification();\n this.expect(')');\n return wrapped;\n }\n const token = this.readToken();\n if (token === 'Z') {\n return IntegerT;\n }\n if (token === 'R0') {\n return { typeID: TypeID.anyTypification };\n }\n if (!/^[A-Z]\\d+$/.test(token)) {\n throw new Error(`Unknown typification token \"${token}\"`);\n }\n return { typeID: TypeID.basic, baseID: token };\n }\n\n private readToken(): string {\n this.skipSpaces();\n const start = this.index;\n while (!this.eof()) {\n const char = this.peek();\n if (!char || /[\\s,()[\\]→×]/.test(char)) {\n break;\n }\n this.next();\n }\n if (start === this.index) {\n throw new Error('Expected typification token');\n }\n return this.input.slice(start, this.index);\n }\n\n private skipSpaces(): void {\n while (!this.eof() && /\\s/.test(this.peek()!)) {\n this.index += 1;\n }\n }\n\n private expect(symbol: string): void {\n this.skipSpaces();\n if (!this.match(symbol)) {\n throw new Error(`Expected \"${symbol}\"`);\n }\n }\n\n private match(symbol: string): boolean {\n if (this.input.startsWith(symbol, this.index)) {\n this.index += symbol.length;\n return true;\n }\n return false;\n }\n\n private peek(): string | undefined {\n return this.input[this.index];\n }\n\n private next(): string | undefined {\n const value = this.input[this.index];\n this.index += 1;\n return value;\n }\n\n private eof(): boolean {\n return this.index >= this.input.length;\n }\n}\n","/**\n * Module: Multi-graph for typifications.\n */\n\nimport {\n bool,\n type EchelonCollection,\n type EchelonTuple,\n type ExpressionType,\n tuple,\n TypeID,\n type Typification\n} from './semantic/typification';\nimport { labelType } from './labels';\n\n/** Represents a single node of a {@link TypificationGraph}. */\nexport interface TypificationNodeData extends Record<string, unknown> {\n id: number;\n rank: number;\n text: string;\n parents: number[];\n annotations: string[];\n}\n\n/** Represents a typification multi-graph. */\nexport class TypificationGraph {\n /** List of nodes. */\n nodes: TypificationNodeData[] = [];\n /** Map of nodes by ID. */\n nodeById = new Map<number, TypificationNodeData>();\n /** Map of nodes by alias. */\n nodeByAlias = new Map<string, TypificationNodeData>();\n\n /** Adds an element to the graph. */\n addElement(alias: string, type: ExpressionType): void {\n const node = this.processType(type);\n if (!node) {\n return;\n }\n this.addAliasAnnotation(node.id, alias);\n }\n\n private processType(type: ExpressionType): TypificationNodeData | null {\n switch (type.typeID) {\n case TypeID.logic:\n return null;\n\n case TypeID.anyTypification:\n case TypeID.integer:\n case TypeID.basic:\n return this.addBaseNode(type);\n\n case TypeID.collection:\n return this.addBooleanNode(type);\n case TypeID.tuple:\n return this.addCartesianNode(type);\n\n case TypeID.function:\n case TypeID.predicate:\n const combined = convertFunctionToTypification(type);\n if (!combined) {\n return null;\n }\n return this.processType(combined);\n }\n }\n\n private addBaseNode(type: Typification): TypificationNodeData {\n const text = labelType(type);\n const existingNode = this.nodes.find(node => node.text === text);\n if (existingNode) {\n return existingNode;\n }\n\n const node: TypificationNodeData = {\n id: this.nodes.length,\n text: text,\n rank: 0,\n parents: [],\n annotations: []\n };\n this.nodes.push(node);\n this.nodeById.set(node.id, node);\n return node;\n }\n\n private addBooleanNode(type: EchelonCollection): TypificationNodeData | null {\n const baseNode = this.processType(type.base);\n if (!baseNode) {\n return null;\n }\n\n const existingNode = this.nodes.find(node => node.parents.length === 1 && node.parents[0] === baseNode.id);\n if (existingNode) {\n return existingNode;\n }\n\n const node: TypificationNodeData = {\n id: this.nodes.length,\n rank: baseNode.rank + 1,\n text: labelType(type),\n parents: [baseNode.id],\n annotations: []\n };\n this.nodes.push(node);\n this.nodeById.set(node.id, node);\n return node;\n }\n\n private addCartesianNode(type: EchelonTuple): TypificationNodeData | null {\n const factors = type.factors.map(factor => this.processType(factor)).filter(factor => factor !== null);\n if (factors.length !== type.factors.length) {\n return null;\n }\n\n const existingNode = this.nodes.find(\n node => node.parents.length === factors.length && node.parents.every((p, i) => p === factors[i].id)\n );\n if (existingNode) {\n return existingNode;\n }\n\n const node: TypificationNodeData = {\n id: this.nodes.length,\n text: labelType(type),\n rank: Math.max(...factors.map(factor => factor.rank)) + 1,\n parents: factors.map(factor => factor.id),\n annotations: []\n };\n this.nodes.push(node);\n this.nodeById.set(node.id, node);\n return node;\n }\n\n private addAliasAnnotation(node: number, alias: string): void {\n const nodeToAnnotate = this.nodeById.get(node);\n if (!nodeToAnnotate) {\n throw new Error(`Node ${node} not found`);\n }\n nodeToAnnotate.annotations.push(alias);\n this.nodeByAlias.set(alias, nodeToAnnotate);\n }\n}\n\nfunction convertFunctionToTypification(type: ExpressionType): Typification | null {\n if (!('args' in type) || type.args.length === 0) {\n return null;\n }\n const args = type.args.length === 1 ? type.args[0].type : tuple(type.args.map(arg => arg.type));\n if (type.result.typeID === TypeID.logic) {\n return bool(args);\n } else {\n return bool(tuple([type.result, args]));\n }\n}\n","/**\n * Module: Models for formal representation for systems of concepts.\n */\n\nimport { type Graph } from '../graph';\nimport { type AnalysisBase, type ExpressionType, type RSLangAnalyzer, type TypePath } from '../rslang';\n\nimport { type CurrentVersion, type LibraryItem, type LibraryItemReference, type VersionInfo } from './library';\n\n/** Represents {@link Constituenta} type. */\nexport const CstType = {\n NOMINAL: 'nominal',\n BASE: 'basic',\n STRUCTURED: 'structure',\n TERM: 'term',\n AXIOM: 'axiom',\n FUNCTION: 'function',\n PREDICATE: 'predicate',\n CONSTANT: 'constant',\n STATEMENT: 'statement'\n} as const;\nexport type CstType = (typeof CstType)[keyof typeof CstType];\n\n/** Represents attribution of a {@link Constituenta} to another {@link Constituenta}. */\nexport interface Attribution {\n container: number;\n attribute: number;\n}\n\n/** Represents global identifier type info. */\nexport interface TypeInfo {\n alias: string;\n type: ExpressionType;\n}\n\n/** Represents function argument value. */\nexport interface ArgumentValue {\n alias: string;\n typification: string;\n value?: string;\n}\n\n/** Represents Constituenta classification in terms of system of concepts. */\nexport const CstClass = {\n NOMINAL: 'nominal',\n BASIC: 'basic',\n DERIVED: 'derived',\n STATEMENT: 'statement',\n TEMPLATE: 'template'\n} as const;\nexport type CstClass = (typeof CstClass)[keyof typeof CstClass];\n\n/** Represents formal expression Status. */\nexport const CstStatus = {\n VERIFIED: 'verified',\n INCORRECT: 'incorrect',\n INCALCULABLE: 'incalculable',\n PROPERTY: 'property',\n UNKNOWN: 'unknown'\n} as const;\nexport type CstStatus = (typeof CstStatus)[keyof typeof CstStatus];\n\n/** Represents substitution of {@link Constituenta}. */\nexport interface Substitution {\n original: number;\n substitution: number;\n}\n\n/** Represents word form for natural language. */\ninterface TermForm {\n text: string;\n tags: string;\n}\n\n/** Represents Constituenta. */\nexport interface Constituenta {\n id: number;\n crucial: boolean;\n alias: string;\n convention: string;\n cst_type: CstType;\n definition_formal: string;\n definition_raw: string;\n definition_resolved: string;\n term_raw: string;\n term_resolved: string;\n term_forms: TermForm[];\n attributes: number[];\n\n /** Manual typification of the constituent */\n typification_manual: string;\n\n /** Controls whether base concepts expose property values or full values */\n value_is_property: boolean;\n\n homonyms: number[];\n formalDuplicates: number[];\n analysis: AnalysisBase;\n\n /** Typification used for dependents, model values, and display (manual when it overrides computed). */\n effectiveType: ExpressionType | null;\n\n /**\n * True when manual typification is non-empty, parses to a type, and its label differs from the\n * typification inferred from the formal definition ({@link Constituenta.analysis}.type).\n */\n is_type_mismatch: boolean;\n\n /** Identifier of {@link LibraryItem} containing this {@link Constituenta}. */\n schema: number;\n\n /** {@link CstClass} of this {@link Constituenta}. */\n cst_class: CstClass;\n /** {@link CstStatus} of this {@link Constituenta}. */\n status: CstStatus;\n\n /** Indicates if this {@link Constituenta} is a template. */\n is_template: boolean;\n /** Indicates if this {@link Constituenta} has a simple expression. */\n is_simple_expression: boolean;\n\n /** Index of {@link LibraryItem} that contains this cst (or inheritance parent).\n * 0 - not inherited, 1 - inherited by 1st schema, 2 - inherited by 2nd schema, etc.\n */\n parent_schema_index: number;\n /** {@link LibraryItem} that contains parent of this inherited {@link Constituenta}. */\n parent_schema: number | null;\n /** Indicates if this {@link Constituenta} is inherited. */\n is_inherited: boolean;\n /** Indicates if this {@link Constituenta} has children that are inherited. */\n has_inherited_children: boolean;\n\n /** {@link Constituenta} that spawned this one. */\n spawner?: number;\n /** Alias of {@link Constituenta} that spawned this one. */\n spawner_alias?: string;\n /** Structure path that spawned this one. */\n spawner_path?: TypePath;\n\n /** List of {@link Constituenta} that are spawned by this one. */\n spawn: number[];\n /** List of aliases of {@link Constituenta} that are spawned by this one. */\n spawn_alias: string[];\n}\n\n/** Represents {@link RSForm} statistics. */\nexport interface RSFormStats {\n step_complexity: number;\n\n /** Total number of constituents in the RSForm. */\n count_all: number;\n /** Number of crucial constituents in the RSForm. */\n count_crucial: number;\n\n count_problematic: number;\n /** Constituents that have same term. */\n count_homonyms: number;\n /** Constituents that have same formal definition and term. */\n count_formal_duplicates: number;\n /** Base constituents with no convention and alias. */\n count_missing_convention: number;\n /** Constituents with non-empty manual typification that disagrees with inferred typification. */\n count_type_mismatch: number;\n\n count_incorrect: number;\n count_property: number;\n count_incalculable: number;\n count_inherited: number;\n\n count_text_term: number;\n count_definition: number;\n count_convention: number;\n count_comment: number;\n\n count_base: number;\n count_constant: number;\n count_structured: number;\n count_axiom: number;\n count_term: number;\n count_function: number;\n count_predicate: number;\n count_statement: number;\n count_nominal: number;\n}\n\n/** Represents inheritance data for {@link RSForm}. */\ninterface InheritanceInfo {\n child: number;\n child_source: number;\n parent: number;\n parent_source: number;\n}\n\n/** Represents formal explication for set of concepts. */\nexport interface RSForm extends LibraryItem {\n /** Whether this RSForm was produced (vs imported or inherited) */\n is_produced: boolean;\n /** Whether this RSForm has attribution feature */\n is_attributive: boolean;\n /** List of user IDs who can edit this RSForm */\n editors: number[];\n /** Information about the current version of this RSForm */\n version: CurrentVersion;\n /** Full version history of this RSForm */\n versions: VersionInfo[];\n\n /** Full list of constituents in the RSForm */\n items: Constituenta[];\n /** List of inheritance relationships between constituents */\n inheritance: InheritanceInfo[];\n /** List of constituent attribution relationships */\n attribution: Attribution[];\n /** References to Operational Schemes/Systems associated with the RSForm */\n oss: LibraryItemReference[];\n /** References to conceptual models associated with the RSForm */\n models: LibraryItemReference[];\n\n /** Analyzer instance for RS language features and validation */\n analyzer: RSLangAnalyzer;\n /** Graph structure representing formal dependencies between constituents */\n graph: Graph;\n /** Graph structure representing attribution relationships */\n attribution_graph: Graph;\n /** Map for quick lookup of constituents by alias */\n cstByAlias: Map<string, Constituenta>;\n /** Map for quick lookup of constituents by ID */\n cstByID: Map<number, Constituenta>;\n}\n","/**\n * Module: API for formal representation for systems of concepts.\n */\n\nimport {\n type AnalysisFull,\n RSErrorCode,\n TypeClass,\n TypeID,\n type TypePath,\n type Typification,\n ValueClass\n} from '../rslang';\nimport { basic, bool, constant, type EchelonFunctional, isTypification } from '../rslang/semantic/typification';\nimport { applyPath } from '../rslang/semantic/typification-api';\n\nimport { type LibraryItem } from './library';\nimport {\n type ArgumentValue,\n type Constituenta,\n CstClass,\n CstStatus,\n CstType,\n type RSForm,\n type RSFormStats\n} from './rsform';\n\n/** Record of {@link CstType} prefixes. */\nconst CST_TYPE_PREFIX: Record<CstType, string> = {\n [CstType.NOMINAL]: 'N',\n [CstType.BASE]: 'X',\n [CstType.CONSTANT]: 'C',\n [CstType.STRUCTURED]: 'S',\n [CstType.AXIOM]: 'A',\n [CstType.TERM]: 'D',\n [CstType.FUNCTION]: 'F',\n [CstType.PREDICATE]: 'P',\n [CstType.STATEMENT]: 'T'\n};\n\n/** Record of {@link CstType} to {@link CstClass} mapping. */\nconst CST_TYPE_TO_CLASS: Record<CstType, CstClass> = {\n [CstType.NOMINAL]: CstClass.NOMINAL,\n [CstType.BASE]: CstClass.BASIC,\n [CstType.CONSTANT]: CstClass.BASIC,\n [CstType.STRUCTURED]: CstClass.BASIC,\n [CstType.TERM]: CstClass.DERIVED,\n [CstType.FUNCTION]: CstClass.DERIVED,\n [CstType.AXIOM]: CstClass.STATEMENT,\n [CstType.PREDICATE]: CstClass.DERIVED,\n [CstType.STATEMENT]: CstClass.STATEMENT\n};\n\n/** Checks if {@link Constituenta} is a schema issue. */\nexport function isSchemaIssue(cst: Constituenta): boolean {\n if (\n cst.homonyms.length > 0 ||\n cst.formalDuplicates.length > 0 ||\n cst.status === CstStatus.INCORRECT ||\n cst.status === CstStatus.INCALCULABLE ||\n cst.is_type_mismatch\n ) {\n return true;\n }\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Infers the status of an expression based on parsing and value information. */\nexport function inferStatus(parse: boolean, value?: ValueClass | null): CstStatus {\n if (!parse) {\n return CstStatus.INCORRECT;\n }\n if (value === null) {\n return CstStatus.INCALCULABLE;\n }\n if (value === ValueClass.PROPERTY) {\n return CstStatus.PROPERTY;\n }\n return CstStatus.VERIFIED;\n}\n\n/** Infers type of constituent for a given template and arguments. */\nexport function inferTemplatedType(templateType: CstType, args: ArgumentValue[]): CstType {\n if (args.length === 0 || args.some(arg => !arg.value)) {\n return templateType;\n } else if (templateType === CstType.PREDICATE) {\n return CstType.AXIOM;\n } else {\n return CstType.TERM;\n }\n}\n\n/** Checks if given expression is a template. */\nexport function inferTemplate(expression: string): boolean {\n const match = expression.match(/R\\d+/g);\n return (match && match?.length > 0) ?? false;\n}\n\n/** Infers the {@link CstClass} based on the provided {@link CstType} and template status. */\nexport function inferClass(type: CstType, isTemplate: boolean = false): CstClass {\n if (isTemplate) {\n return CstClass.TEMPLATE;\n }\n return CST_TYPE_TO_CLASS[type];\n}\n\n/** Check if {@link Constituenta} is a template or a category. */\nexport function isTemplateCst(cst: Constituenta): boolean {\n return cst.cst_type === CstType.FUNCTION || cst.cst_type === CstType.PREDICATE || cst.cst_type === CstType.STATEMENT;\n}\n\n/** Apply filter based on start {@link Constituenta} type. */\nexport function applyFilterCategory(start: Constituenta, items: Constituenta[]): Constituenta[] {\n const startIndex = items.indexOf(start);\n if (startIndex === -1) {\n return [];\n }\n const nextCategoryIndex = items.findIndex((cst, index) => index > startIndex && cst.cst_type === CstType.STATEMENT);\n\n return items.filter((_, index) => index >= startIndex && (nextCategoryIndex === -1 || index < nextCategoryIndex));\n}\n\n/** Prefix for alias indicating {@link CstType}. */\nexport function getCstTypePrefix(type: CstType): string {\n return CST_TYPE_PREFIX[type];\n}\n\n/** Guess {@link CstType} from user input hint. */\nexport function guessCstType(hint: string): CstType | null {\n if (hint.length !== 1) {\n return null;\n }\n for (const [type, prefix] of Object.entries(CST_TYPE_PREFIX)) {\n if (hint === prefix) {\n return type as CstType;\n }\n }\n return null;\n}\n\n/** Evaluate if {@link CstType} is basic concept. */\nexport function isBasicConcept(type: CstType): boolean {\n switch (type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n return true;\n\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is base set or constant set. */\nexport function isBaseSet(type: CstType): boolean {\n switch (type) {\n case CstType.BASE:\n case CstType.CONSTANT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is a function. */\nexport function isFunctional(type: CstType): boolean {\n switch (type) {\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is logical. */\nexport function isLogical(type: CstType): boolean {\n switch (type) {\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return false;\n }\n}\n\n/** Evaluate if {@link Constituenta} can be used produce structure. */\nexport function canProduceStructure(cst: Constituenta): boolean {\n switch (cst.cst_type) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n case CstType.PREDICATE:\n return false;\n }\n if (!cst.effectiveType) {\n return false;\n }\n if (cst.cst_type === CstType.FUNCTION) {\n const result = (cst.effectiveType as EchelonFunctional).result;\n return typeCanProduceStructure(result);\n }\n if (!isTypification(cst.effectiveType)) {\n return false;\n }\n return typeCanProduceStructure(cst.effectiveType as Typification);\n}\n\n/** Evaluate if {@link CstType} can have manual typification. */\nexport function canHaveManualTypification(type: CstType): boolean {\n switch (type) {\n case CstType.STRUCTURED:\n case CstType.TERM:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return false;\n }\n}\n\n/** Validate new alias against {@link CstType} and {@link RSForm}. */\nexport function validateNewAlias(alias: string, type: CstType, schema: RSForm): boolean {\n if (alias.length < 2) {\n return false;\n }\n const prefix = getCstTypePrefix(type);\n if (!alias.startsWith(prefix)) {\n return false;\n }\n if (schema.cstByAlias.has(alias)) {\n return false;\n }\n if (!/^\\d+$/.exec(alias.substring(prefix.length))) {\n return false;\n }\n return true;\n}\n\n/** Generate alias for new {@link Constituenta} of a given {@link CstType} for current {@link RSForm}. */\nexport function generateAlias(type: CstType, schema: RSForm, takenAliases: string[] = []): string {\n const prefix = getCstTypePrefix(type);\n if (schema.items.length <= 0) {\n return `${prefix}1`;\n }\n let index = schema.items.reduce((prev, cst, index) => {\n if (cst.cst_type !== type) {\n return prev;\n }\n index = Number(cst.alias.slice(1 - cst.alias.length)) + 1;\n return Math.max(prev, index);\n }, 1);\n let alias = `${prefix}${index}`;\n while (takenAliases.includes(alias)) {\n index = index + 1;\n alias = `${prefix}${index}`;\n }\n return alias;\n}\n\n/**\n * Id to pass as `insert_after` when creating a new {@link Constituenta} spawned by `targetId`:\n * after the last existing child of that spawner, or after the spawner itself if none.\n */\nexport function inferNewSpawnPosition(schema: RSForm, targetId: number): number {\n let last: number | null = null;\n for (const cst of schema.items) {\n if (cst.spawner === targetId) {\n last = cst.id;\n }\n }\n return last ?? targetId;\n}\n\n/** Sorts library items relevant for InlineSynthesis with specified {@link RSForm}. */\nexport function sortItemsForInlineSynthesis(receiver: RSForm, items: readonly LibraryItem[]): LibraryItem[] {\n const result = items.filter(item => item.location === receiver.location);\n for (const item of items) {\n if (item.visible && item.owner === item.owner && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (item.visible && !result.includes(item)) {\n result.push(item);\n }\n }\n for (const item of items) {\n if (!result.includes(item)) {\n result.push(item);\n }\n }\n return result;\n}\n\n/** Remove alias from expression. */\nexport function removeAliasReference(expression: string, alias: string): string {\n const result = expression.replaceAll(new RegExp(`\\\\b${alias}\\\\b`, 'g'), 'DEL');\n return result === 'DEL' ? '' : result;\n}\n\n/** Add alias to expression. */\nexport function addAliasReference(expression: string, alias: string): string {\n return expression + ' ' + alias;\n}\n\n/** Returns expected {@link TypeClass} of formal definition for {@link CstType}. */\nexport function typeClassForCstType(cstType: CstType): TypeClass {\n switch (cstType) {\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.TERM:\n return TypeClass.typification;\n case CstType.FUNCTION:\n return TypeClass.function;\n case CstType.PREDICATE:\n return TypeClass.predicate;\n case CstType.AXIOM:\n case CstType.STATEMENT:\n return TypeClass.logic;\n }\n}\n\n/** Checks whether a constituenta type supports formal definitions. */\nexport function canHaveFormalDefinition(cstType: CstType): boolean {\n return cstType !== CstType.BASE && cstType !== CstType.CONSTANT;\n}\n\n/** Analyze expression for {@link RSForm}. */\nexport function getAnalysisFor(expression: string, cstType: CstType, schema: RSForm, alias?: string): AnalysisFull {\n if (!canHaveFormalDefinition(cstType)) {\n if (expression.trim().length === 0) {\n const fallbackAlias = alias && alias.length > 0 ? alias : 'X0';\n const type = cstType === CstType.BASE ? bool(basic(fallbackAlias)) : bool(constant(fallbackAlias));\n return {\n success: true,\n type,\n valueClass: ValueClass.VALUE,\n errors: [],\n ast: null\n };\n }\n return {\n success: false,\n type: null,\n valueClass: null,\n errors: [\n {\n code: RSErrorCode.definitionNotAllowed,\n from: 0,\n to: Math.max(0, expression.length - 1)\n }\n ],\n ast: null\n };\n }\n return schema.analyzer.checkFull(expression, {\n expected: typeClassForCstType(cstType),\n isDomain: cstType === CstType.STRUCTURED\n });\n}\n\n/** Calculate statistics for {@link RSForm}. */\nexport function calculateSchemaStats(target: RSForm): RSFormStats {\n const items = target.items;\n return {\n count_all: items.length,\n count_crucial: items.reduce((sum, cst) => sum + (cst.crucial ? 1 : 0), 0),\n\n step_complexity: items.reduce((sum, cst) => sum + calculateStepComplexity(cst), 0),\n\n count_problematic: items.reduce((sum, cst) => sum + (isSchemaIssue(cst) ? 1 : 0), 0),\n count_homonyms: items.reduce((sum, cst) => sum + (cst.homonyms.length > 0 ? 1 : 0), 0),\n count_formal_duplicates: items.reduce((sum, cst) => sum + (cst.formalDuplicates.length > 0 ? 1 : 0), 0),\n count_missing_convention: items.reduce((sum, cst) => sum + (isMissingConvention(cst) ? 1 : 0), 0),\n count_type_mismatch: items.reduce((sum, cst) => sum + (cst.is_type_mismatch ? 1 : 0), 0),\n\n count_incorrect: items.reduce((sum, cst) => sum + (cst.status === CstStatus.INCORRECT ? 1 : 0), 0),\n count_property: items.reduce((sum, cst) => sum + (cst.analysis?.valueClass === ValueClass.PROPERTY ? 1 : 0), 0),\n count_incalculable: items.reduce(\n (sum, cst) => sum + (cst.analysis?.success && cst.analysis.valueClass === null ? 1 : 0),\n 0\n ),\n count_inherited: items.reduce((sum, cst) => sum + (cst.is_inherited ? 1 : 0), 0),\n\n count_text_term: items.reduce((sum, cst) => sum + (cst.term_raw ? 1 : 0), 0),\n count_definition: items.reduce((sum, cst) => sum + (cst.definition_raw ? 1 : 0), 0),\n count_convention: items.reduce((sum, cst) => sum + (isBasicConcept(cst.cst_type) && cst.convention ? 1 : 0), 0),\n count_comment: items.reduce((sum, cst) => sum + (!isBasicConcept(cst.cst_type) && !cst.convention ? 1 : 0), 0),\n\n count_base: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.BASE ? 1 : 0), 0),\n count_constant: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.CONSTANT ? 1 : 0), 0),\n count_structured: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STRUCTURED ? 1 : 0), 0),\n count_axiom: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.AXIOM ? 1 : 0), 0),\n count_term: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.TERM ? 1 : 0), 0),\n count_function: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.FUNCTION ? 1 : 0), 0),\n count_predicate: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.PREDICATE ? 1 : 0), 0),\n count_statement: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.STATEMENT ? 1 : 0), 0),\n count_nominal: items.reduce((sum, cst) => sum + (cst.cst_type === CstType.NOMINAL ? 1 : 0), 0)\n };\n}\n\n/** Finds {@link Constituenta} by structure path. */\nexport function findCstByStructure(schema: RSForm, target: Constituenta, path: TypePath): Constituenta | null {\n for (const cst of schema.items) {\n if (cst.spawner === target.id && cst.spawner_path) {\n if (cst.spawner_path.length === path.length && cst.spawner_path.every((v, i) => v === path[i])) {\n return cst;\n }\n }\n }\n return null;\n}\n\n/** Retrieves name for piece of target {@link Constituenta} structure. */\nexport function getStructureName(schema: RSForm, target: Constituenta, path: TypePath): string {\n const representation = findCstByStructure(schema, target, path);\n if (representation) {\n return `${representation.alias}: ${representation.term_resolved}`;\n }\n if (!isTypification(target.effectiveType)) {\n return '';\n }\n const type = applyPath(target.effectiveType as Typification, path);\n if (type?.typeID === TypeID.basic) {\n const cst = schema.cstByAlias.get(type.baseID);\n if (cst?.term_resolved) {\n return `${cst.alias}: ${cst.term_resolved}`;\n }\n }\n return '';\n}\n\n// ========= Internals =====\nfunction calculateStepComplexity(cst: Constituenta): number {\n if (cst.cst_type === CstType.AXIOM || cst.cst_type === CstType.NOMINAL || !isBasicConcept(cst.cst_type)) {\n return 0;\n }\n if (cst.cst_type === CstType.BASE || cst.cst_type === CstType.CONSTANT || !cst.effectiveType) {\n return 1;\n }\n\n const type = cst.effectiveType as Typification;\n return calculateTypificationComplexity(type) + 1;\n}\n\nfunction calculateTypificationComplexity(type: Typification): number {\n switch (type.typeID) {\n case TypeID.basic:\n case TypeID.integer:\n case TypeID.anyTypification:\n return 0;\n case TypeID.tuple:\n return (\n type.factors.length + type.factors.reduce((sum, factor) => sum + calculateTypificationComplexity(factor), 0)\n );\n case TypeID.collection:\n if (type.base.typeID === TypeID.tuple) {\n let sum = 0;\n type.base.factors.forEach(factor => {\n sum += calculateTypificationComplexity(factor);\n });\n return sum + type.base.factors.length;\n } else if (type.base.typeID === TypeID.collection) {\n return calculateTypificationComplexity(type.base) + 1;\n }\n return 0;\n }\n}\n\nfunction isMissingConvention(cst: Constituenta): boolean {\n if (isBasicConcept(cst.cst_type) && !isLogical(cst.cst_type)) {\n if (!cst.convention || !cst.term_resolved) {\n return true;\n }\n }\n return false;\n}\n\n/** Evaluate if {@link Typification} can be used to produce structure. */\nfunction typeCanProduceStructure(type: Typification): boolean {\n if (type.typeID === TypeID.basic || type.typeID === TypeID.integer || type.typeID === TypeID.anyTypification) {\n return false;\n } else if (type.typeID === TypeID.tuple) {\n return true;\n } else {\n return (\n type.base.typeID !== TypeID.basic &&\n type.base.typeID !== TypeID.integer &&\n type.base.typeID !== TypeID.anyTypification\n );\n }\n}\n","import { type Value } from '../rslang';\n\nimport { type LibraryItem } from './library';\nimport { type RSFormStats } from './rsform';\n\nexport const TYPE_BASIC = 'basic';\n\n/** Evaluation status enumeration. */\nexport const EvalStatus = {\n NO_EVAL: 1, // не вычисляется\n NOT_PROCESSED: 2, // Интерпретация не вычислялась\n INVALID_DATA: 3, // Неверные данные\n EVAL_FAIL: 4, // Ошибка при вычислении\n AXIOM_FALSE: 5, // Значение аксиомы = FALSE\n EMPTY: 6, // Значение пусто\n HAS_DATA: 7 // Интерпретация вычислена и не пуста\n} as const;\nexport type EvalStatus = (typeof EvalStatus)[keyof typeof EvalStatus];\n\n/** Represents basic element binding. */\nexport type BasicBinding = Record<number, string>;\n\n/** Represents {@link RSModel} basic sets binding. */\nexport type BasicsContext = Map<number, BasicBinding>;\n\n/** Default value for structured data. */\nexport const DEFAULT_VALUE_TEXT = 'N/A';\n\ninterface RSModelData extends LibraryItem {\n editors: number[];\n schema: number;\n items: {\n id: number;\n type: string;\n value: Value | BasicBinding;\n }[];\n}\n\n/** Represents {@link RSModel} structured data. */\nexport type RSModel = RSModelData;\n\n/** Represents {@link RSModel} statistics. */\nexport interface RSModelStats extends RSFormStats {\n count_missing_base: number;\n count_false_axioms: number;\n count_invalid_data: number;\n count_invalid_calculations: number;\n count_empty_terms: number;\n base_elements: number;\n}\n","import { type ExpressionType, TypeID, type Typification, type Value } from '../rslang';\nimport { compare, tuple, TUPLE_ID, VALUE_TRUE, type ValuePath } from '../rslang/eval/value';\nimport { extractValue, isTupleValue, makeDefaultValue, setNestedValue } from '../rslang/eval/value-api';\nimport { type EchelonCollection } from '../rslang/semantic/typification';\n\nimport { type RSEngine } from './rsengine';\nimport { type Constituenta, CstType, type RSForm } from './rsform';\nimport { calculateSchemaStats, isBaseSet, isBasicConcept } from './rsform-api';\nimport { type BasicBinding, EvalStatus, type RSModelStats } from './rsmodel';\n\nconst RANDOM_INTEGER_MIN = -100;\nconst RANDOM_INTEGER_MAX = 100;\nconst DEFAULT_RANDOM_SET_ELEMENTS_COUNT = 5;\n\n/** Evaluate if parsed data is a basic binding data. */\nexport function validateBasicBindingData(data: unknown): data is Record<string, string> {\n if (!data || typeof data !== 'object' || Array.isArray(data)) {\n return false;\n }\n return Object.entries(data).every(([key, value]) => typeof value === 'string' && Number.isInteger(Number(key)));\n}\n\n/** Convert parsed data to a basic binding. */\nexport function toBasicBinding(data: Record<string | number, string>): BasicBinding {\n const result: BasicBinding = {};\n for (const [k, v] of Object.entries(data)) {\n result[Number(k)] = v;\n }\n return result;\n}\n\n/** Evaluate if parsed data is a {@link Value} data. */\nexport function validateValueData(data: unknown): data is Value {\n if (typeof data === 'number') {\n return Number.isFinite(data);\n }\n if (!Array.isArray(data)) {\n return false;\n }\n return data.every(item => validateValueData(item));\n}\n\nexport function generateRandomValue(\n type: Typification,\n basics: Map<number, BasicBinding>,\n cstByAlias: Map<string, Constituenta>,\n setElementsCount: number = DEFAULT_RANDOM_SET_ELEMENTS_COUNT\n): Value | null {\n switch (type.typeID) {\n case TypeID.integer:\n return Math.floor(Math.random() * (RANDOM_INTEGER_MAX - RANDOM_INTEGER_MIN + 1)) + RANDOM_INTEGER_MIN;\n case TypeID.basic: {\n const cst = cstByAlias.get(type.baseID);\n const binding = cst ? basics.get(cst.id) : undefined;\n const ids = Object.keys(binding ?? {}).map(Number);\n if (ids.length === 0) {\n return null;\n }\n return ids[Math.floor(Math.random() * ids.length)];\n }\n case TypeID.tuple: {\n const factors: Value[] = [];\n for (const factor of type.factors) {\n const sample = generateRandomValue(factor, basics, cstByAlias, setElementsCount);\n if (sample === null) {\n return null;\n }\n factors.push(sample);\n }\n return tuple(factors);\n }\n case TypeID.collection: {\n const result: Value[] = [];\n const randomElementsCount = Math.floor(Math.random() * (setElementsCount + 1));\n for (let i = 0; i < randomElementsCount; i++) {\n const sample = generateRandomValue(type.base, basics, cstByAlias, setElementsCount);\n if (sample === null) {\n return null;\n }\n result.push(sample);\n }\n return result;\n }\n case TypeID.anyTypification:\n return null;\n }\n}\n\n/** Calculate statistics for {@link RSModel}. */\nexport function calculateModelStats(schema: RSForm, engine: RSEngine, _engineGeneration?: number): RSModelStats {\n const items = schema.items;\n const statusByID = new Map<number, EvalStatus>();\n for (const cst of items) {\n statusByID.set(cst.id, engine.getCstStatus(cst.id));\n }\n return {\n ...calculateSchemaStats(schema),\n base_elements: items.reduce((sum, cst) => sum + countBaseElements(cst, engine), 0),\n count_missing_base: items.reduce(\n (sum, cst) => sum + (statusByID.get(cst.id) === EvalStatus.EMPTY && isBasicConcept(cst.cst_type) ? 1 : 0),\n 0\n ),\n count_false_axioms: items.reduce(\n (sum, cst) => sum + (statusByID.get(cst.id) === EvalStatus.AXIOM_FALSE ? 1 : 0),\n 0\n ),\n count_invalid_data: items.reduce(\n (sum, cst) => sum + (statusByID.get(cst.id) === EvalStatus.INVALID_DATA ? 1 : 0),\n 0\n ),\n count_invalid_calculations: items.reduce(\n (sum, cst) =>\n sum +\n (statusByID.get(cst.id) === EvalStatus.EVAL_FAIL || statusByID.get(cst.id) === EvalStatus.NOT_PROCESSED\n ? 1\n : 0),\n 0\n ),\n count_empty_terms: items.reduce(\n (sum, cst) => sum + (statusByID.get(cst.id) === EvalStatus.EMPTY && cst.cst_type === CstType.TERM ? 1 : 0),\n 0\n )\n };\n}\n\n/** Checks whether evaluation status contributes to model status issues. */\nexport function isModelIssue(engine: RSEngine, cst: Constituenta): boolean {\n const status = engine.getCstStatus(cst.id);\n const isBasic = isBasicConcept(cst.cst_type);\n return (\n status === EvalStatus.EVAL_FAIL ||\n status === EvalStatus.AXIOM_FALSE ||\n status === EvalStatus.INVALID_DATA ||\n (isBasic && status === EvalStatus.EMPTY)\n );\n}\n\n/** Evaluate if {@link CstType} is interpretable. */\nexport function isInterpretable(type: CstType): boolean {\n switch (type) {\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.AXIOM:\n case CstType.TERM:\n case CstType.STATEMENT:\n return true;\n\n case CstType.NOMINAL:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return false;\n }\n}\n\n/** Evaluate if {@link CstType} is inferrable. */\nexport function isInferrable(type: CstType): boolean {\n switch (type) {\n case CstType.AXIOM:\n case CstType.STATEMENT:\n case CstType.TERM:\n return true;\n\n case CstType.NOMINAL:\n case CstType.BASE:\n case CstType.CONSTANT:\n case CstType.STRUCTURED:\n case CstType.FUNCTION:\n case CstType.PREDICATE:\n return false;\n }\n}\n\n/** Infers status of a given {@link Value} and {@link CstType}. */\nexport function inferEvalStatus(\n value: Value | null,\n cstType: CstType,\n wasCalculated: boolean = true,\n isInvalid: boolean = false\n): EvalStatus {\n if (isBaseSet(cstType) || cstType === CstType.STRUCTURED) {\n if (isInvalid) {\n return EvalStatus.INVALID_DATA;\n }\n if (value === null || (Array.isArray(value) && value.length === 0)) {\n return EvalStatus.EMPTY;\n }\n return EvalStatus.HAS_DATA;\n }\n if (!isInferrable(cstType)) {\n return EvalStatus.NO_EVAL;\n }\n if (!wasCalculated) {\n return EvalStatus.NOT_PROCESSED;\n }\n if (value === null) {\n return EvalStatus.EVAL_FAIL;\n }\n if (cstType === CstType.AXIOM && value !== VALUE_TRUE) {\n return EvalStatus.AXIOM_FALSE;\n }\n if (Array.isArray(value) && value.length === 0) {\n return EvalStatus.EMPTY;\n }\n return EvalStatus.HAS_DATA;\n}\n\n/** Tries to fix value removing invalid base elements not present in the target value.\n * returns null if no fixing is possible.\n * returns true if fixing was successful.\n * returns false if fixing was not needed.\n */\nexport function tryFixValue(\n value: Value,\n type: ExpressionType,\n targetAlias: string,\n targetValue: Value[]\n): boolean | null {\n switch (type.typeID) {\n case TypeID.integer:\n return false;\n case TypeID.basic:\n if (type.baseID !== targetAlias) {\n return false;\n }\n if (typeof value !== 'number') {\n return null;\n }\n if (!targetValue.includes(value)) {\n return null;\n }\n return false;\n case TypeID.tuple: {\n if (!isTupleValue(value)) {\n return null;\n }\n let wasChanged = false;\n for (let i = 0; i < type.factors.length; i++) {\n const componentChanged = tryFixValue(value[i + 1], type.factors[i], targetAlias, targetValue);\n if (componentChanged === null) {\n return null;\n }\n if (componentChanged) {\n wasChanged = true;\n }\n }\n return wasChanged;\n }\n case TypeID.collection:\n if (!Array.isArray(value) || (value.length > 1 && value[0] === TUPLE_ID)) {\n return null;\n }\n let wasChanged = false;\n const removeElements: Value[] = [];\n for (const item of value) {\n const elementChanged = tryFixValue(item, type.base, targetAlias, targetValue);\n if (elementChanged === null || elementChanged === true) {\n wasChanged = true;\n if (elementChanged === null) {\n removeElements.push(item);\n }\n }\n }\n for (const item of removeElements) {\n const index = value.indexOf(item);\n if (index !== -1) {\n value.splice(index, 1);\n }\n }\n if (wasChanged) {\n value.sort((a, b) => compare(a, b));\n let i = 1;\n while (i < value.length) {\n if (compare(value[i], value[i - 1]) === 0) {\n value.splice(i, 1);\n } else {\n i++;\n }\n }\n }\n return wasChanged;\n\n case TypeID.logic:\n case TypeID.anyTypification:\n case TypeID.predicate:\n case TypeID.function:\n return null;\n }\n}\n\nexport function updateValueElement(value: Value | null, path: ValuePath, newValue: number): Value | null {\n return setNestedValue(value, path, newValue);\n}\n\nexport function deleteValueElement(\n value: Value | null,\n path: ValuePath,\n type: Typification,\n target: number\n): Value | null {\n if (path.length === 0 && type.typeID !== TypeID.collection) {\n return null;\n }\n\n const arrayValue = extractValue(value!, path)! as Value[];\n const updatedArray = [...arrayValue.slice(0, target), ...arrayValue.slice(target + 1)];\n return setNestedValue(value, path, updatedArray);\n}\n\nexport function addValueElement(\n value: Value | null,\n path: ValuePath,\n type: Typification,\n currentType: Typification\n): Value | null {\n if (path.length === 0 && type.typeID !== TypeID.collection) {\n return makeDefaultValue(type);\n }\n\n const newElem = makeDefaultValue((currentType as EchelonCollection).base);\n const arrayValue = (extractValue(value!, path) as Value[] | null) ?? [];\n const updatedArray = [newElem, ...arrayValue];\n return setNestedValue(value, path, updatedArray);\n}\n\n// ========= Internal functions ==========\n\nfunction countBaseElements(cst: Constituenta, engine: RSEngine): number {\n if (!isBasicConcept(cst.cst_type)) {\n return 0;\n }\n const value = engine.getCstValue(cst.id);\n if (value === null) {\n return 0;\n }\n if (!Array.isArray(value) || value[0] === TUPLE_ID) {\n return 1;\n }\n return value.length;\n}\n","import { type AstNode } from '../parsing';\nimport { type CalculatorEvaluateOptions, type CalculatorResult, RSCalculator, TypeID, type Value } from '../rslang';\nimport { compare } from '../rslang/eval/value';\nimport { normalizeType } from '../rslang/labels';\n\nimport { CstType, type RSForm } from './rsform';\nimport { getAnalysisFor, isBaseSet, isBasicConcept, isFunctional } from './rsform-api';\nimport { type BasicBinding, type BasicsContext, type EvalStatus, type RSModel, TYPE_BASIC } from './rsmodel';\nimport { inferEvalStatus, isInferrable, tryFixValue } from './rsmodel-api';\n\nconst INVALID_TYPE_MARKER = 'INVALID';\n\n/** Services for {@link RSEngine}. */\nexport interface RSEngineServices {\n setCstValue: (args: {\n itemID: number;\n data: { target: number; type: string; data: Value | BasicBinding }[];\n }) => Promise<unknown>;\n clearValues: (args: { itemID: number; data: { items: number[] } }) => Promise<unknown>;\n}\n\n/** Notifications for {@link RSEngine}. */\nexport interface RSEngineNotifications {\n onInvalidSetValue: () => void;\n onCalculationSuccess: (timeSpent: string) => void;\n onEvaluationError: (message: string) => void;\n}\n\n/** Calculation engine for {@link RSModel}. */\nexport class RSEngine {\n public modelID: number;\n public schema: RSForm | null = null;\n public data: RSModel | null = null;\n public calculator = new RSCalculator();\n public basics: BasicsContext = new Map<number, BasicBinding>();\n\n private services: RSEngineServices;\n private notifications: RSEngineNotifications | null;\n private invalidData = new Set<number>();\n private calculatedSet = new Set<number>();\n private valueSubscribers = new Map<number, Set<() => void>>();\n private statusSubscribers = new Map<number, Set<() => void>>();\n private changeSubscribers = new Set<() => void>();\n private changeGeneration = 0;\n private pendingChange = false;\n private coalescedEmitTimeout: ReturnType<typeof setTimeout> | null = null;\n\n constructor(modelID: number, services: RSEngineServices, notifications: RSEngineNotifications | null = null) {\n this.services = services;\n this.notifications = notifications;\n this.modelID = modelID;\n }\n\n /** Updates data for {@link RSEngine}. */\n public loadData(schema: RSForm, model: RSModel): void {\n const oldSchema = this.schema;\n const newSchema = oldSchema !== schema;\n this.schema = schema;\n if (newSchema) {\n const changedCst = this.collectChanged(oldSchema, schema);\n this.prepareAst();\n this.setupEmptySets();\n this.onChangeDefinitions(changedCst);\n }\n if (this.data !== model) {\n this.data = model;\n this.prepareValues();\n }\n this.notifyAll();\n }\n\n /** Updates services for {@link RSEngine}. */\n public updateServices(services: RSEngineServices): void {\n this.services = services;\n }\n\n /** Updates notifications for {@link RSEngine}. */\n public updateNotifications(notifications: RSEngineNotifications | null): void {\n this.notifications = notifications;\n }\n\n /** Gets value of {@link Constituenta}. */\n public getCstValue(cstID: number): Value | null {\n const cst = this.schema?.cstByID.get(cstID);\n if (!cst) {\n return null;\n }\n return this.calculator.getValue(cst.alias);\n }\n\n /** Gets status of {@link Constituenta}. */\n public getCstStatus(cstID: number): EvalStatus {\n const cst = this.schema?.cstByID.get(cstID);\n if (!cst) {\n return inferEvalStatus(null, CstType.NOMINAL, false);\n }\n const value = this.calculator.getValue(cst.alias);\n return inferEvalStatus(value, cst.cst_type, this.calculatedSet.has(cstID), this.invalidData.has(cstID));\n }\n\n /** Subscribe to value change of {@link Constituenta}. */\n public subscribeValue(cstID: number, callbackFn: () => void): () => void {\n let subs = this.valueSubscribers.get(cstID);\n if (!subs) {\n subs = new Set();\n this.valueSubscribers.set(cstID, subs);\n }\n subs.add(callbackFn);\n return () => {\n const current = this.valueSubscribers.get(cstID);\n if (!current) {\n return;\n }\n current.delete(callbackFn);\n if (current.size === 0) {\n this.valueSubscribers.delete(cstID);\n }\n };\n }\n\n /** Subscribe to status change of {@link Constituenta}. */\n public subscribeStatus(cstID: number, callbackFn: () => void): () => void {\n let subs = this.statusSubscribers.get(cstID);\n if (!subs) {\n subs = new Set();\n this.statusSubscribers.set(cstID, subs);\n }\n subs.add(callbackFn);\n return () => {\n const current = this.statusSubscribers.get(cstID);\n if (!current) {\n return;\n }\n current.delete(callbackFn);\n if (current.size === 0) {\n this.statusSubscribers.delete(cstID);\n }\n };\n }\n\n /**\n * Subscribe to any engine change that can affect evaluation (values, status, or loaded data).\n */\n public subscribeChanges(callbackFn: () => void): () => void {\n this.changeSubscribers.add(callbackFn);\n return () => {\n this.changeSubscribers.delete(callbackFn);\n };\n }\n\n /** Monotonic counter bumped whenever the engine emits a change to {@link RSEngine.subscribeChanges} listeners. */\n public getChangeGeneration(): number {\n return this.changeGeneration;\n }\n\n /**\n * Runs pending {@link RSEngine.subscribeChanges} notifications immediately and clears the coalescing queue.\n * Use after a synchronous batch of engine updates when listeners must observe a bumped {@link getChangeGeneration}\n * in the same turn.\n */\n public flushPendingChanges(): void {\n if (this.coalescedEmitTimeout !== null) {\n clearTimeout(this.coalescedEmitTimeout);\n this.coalescedEmitTimeout = null;\n }\n if (!this.pendingChange) {\n return;\n }\n this.pendingChange = false;\n this.emitChange();\n }\n\n /** Sets value for {@link Constituenta} from {@link Value}. */\n public async setStructureValue(cstID: number, data: Value): Promise<void> {\n const cst = this.schema?.cstByID.get(cstID);\n if (!this.schema || !cst || isInferrable(cst.cst_type)) {\n this.notifications?.onInvalidSetValue();\n return;\n }\n\n const typeStr = cst.effectiveType ? normalizeType(cst.effectiveType) : INVALID_TYPE_MARKER;\n const payload = [{ target: cstID, type: typeStr, data }];\n await this.services.setCstValue({ itemID: this.modelID, data: payload });\n\n if (!cst.effectiveType || !this.calculator.validate(data, cst.effectiveType)) {\n this.invalidData.add(cstID);\n } else {\n this.invalidData.delete(cstID);\n }\n this.calculator.setValue(cst.alias, data);\n this.notifyCst(cstID);\n this.cascadeReset([cstID]);\n }\n\n /** Sets value for {@link Constituenta} from {@link BasicBinding}. */\n public async setBasicValue(cstID: number, data: BasicBinding): Promise<void> {\n const cst = this.schema?.cstByID.get(cstID);\n if (!this.schema || !cst || !isBaseSet(cst.cst_type)) {\n this.notifications?.onInvalidSetValue();\n return;\n }\n const oldValue = this.calculator.getValue(cst.alias);\n const newValue = Object.keys(data).map(Number);\n\n const updateList: Parameters<RSEngineServices['setCstValue']>[0]['data'] = [\n { target: cstID, type: TYPE_BASIC, data }\n ];\n const resetList: number[] = [];\n\n if (oldValue !== null && compare(newValue, oldValue) !== 0) {\n const dependencies = this.schema.graph.expandAllOutputs([cstID]);\n for (const childID of dependencies) {\n const child = this.schema.cstByID.get(childID)!;\n if (child.cst_type === CstType.STRUCTURED && !!child.effectiveType) {\n const value = this.calculator.getValue(child.alias);\n if (value !== null) {\n const fix = tryFixValue(value, child.effectiveType, cst.alias, newValue);\n if (fix === null) {\n resetList.push(childID);\n } else if (fix === true) {\n const typeStr = normalizeType(child.effectiveType);\n updateList.push({ target: childID, type: typeStr, data: [...(value as Value[])] });\n }\n }\n }\n }\n }\n\n if (resetList.length > 0) {\n await Promise.all([\n this.services.setCstValue({ itemID: this.modelID, data: updateList }),\n this.services.clearValues({ itemID: this.modelID, data: { items: resetList } })\n ]);\n } else {\n await this.services.setCstValue({ itemID: this.modelID, data: updateList });\n }\n const changed = [...resetList, ...updateList.map(item => item.target)];\n\n this.basics.set(cstID, data);\n this.calculator.setValue(cst.alias, Object.keys(data).map(Number));\n\n for (const item of resetList) {\n this.calculator.resetValue(this.schema.cstByID.get(item)!.alias);\n this.notifyCst(item);\n }\n for (const updateData of updateList) {\n if (updateData.target !== cstID) {\n this.calculator.setValue(\n this.schema.cstByID.get(updateData.target)!.alias,\n updateData.data as unknown as Value\n );\n this.notifyCst(updateData.target);\n }\n }\n for (const item of changed) {\n this.notifyCst(item);\n }\n this.cascadeReset(changed);\n }\n\n /** Resets value for {@link Constituenta}. */\n public async resetValue(cstID: number): Promise<void> {\n const cst = this.schema?.cstByID.get(cstID);\n if (!cst) {\n return;\n }\n await this.services.clearValues({ itemID: this.modelID, data: { items: [cstID] } });\n this.calculator.resetValue(cst.alias);\n this.basics.delete(cstID);\n this.calculatedSet.delete(cstID);\n this.invalidData.delete(cstID);\n this.notifyCst(cstID);\n }\n\n /** Evaluates expression for {@link RSEngine}. */\n public evaluateExpression(expression: string, cstType: CstType): CalculatorResult {\n return getEvaluationFor(expression, cstType, this.schema!, this.calculator, message =>\n this.notifications?.onEvaluationError(message)\n );\n }\n\n /** Evaluates AST for {@link RSEngine}. */\n public evaluateAst(ast: AstNode, options?: CalculatorEvaluateOptions): CalculatorResult {\n try {\n const evaluation = this.calculator.evaluateFull(ast, options);\n return evaluation;\n } catch (error) {\n this.notifications?.onEvaluationError((error as Error).message);\n console.error(error);\n return {\n value: null,\n iterations: 0,\n cacheHits: 0,\n errors: []\n };\n }\n }\n\n /** Calculates value for {@link Constituenta}. */\n public calculateCst(cstID: number): CalculatorResult {\n const cst = this.schema?.cstByID.get(cstID);\n if (!cst || !this.schema) {\n return { value: null, iterations: 0, errors: [], cacheHits: 0 };\n }\n\n if (!this.calculatedSet.has(cstID)) {\n const predecessors = this.schema.graph.expandAllInputs([cstID]);\n this.prepareEvaluation(predecessors);\n }\n const result = getEvaluationFor(cst.definition_formal, cst.cst_type, this.schema, this.calculator, message =>\n this.notifications?.onEvaluationError(message)\n );\n\n if (result.value === null) {\n this.calculator.resetValue(cst.alias);\n } else {\n this.calculator.setValue(cst.alias, result.value);\n }\n\n this.calculatedSet.add(cstID);\n this.notifyCst(cstID);\n\n return result;\n }\n\n /** Recalculate model for all inferrable expressions. */\n recalculateAll(): void {\n const start = performance.now();\n this.calculatedSet.clear();\n this.recalculateInternal();\n const end = performance.now();\n const timeSpent = ((end - start) / 1000).toFixed(2);\n this.notifications?.onCalculationSuccess(timeSpent);\n }\n\n /** Notify subscribers about value and status change of {@link Constituenta}. */\n private notifyCst(cstID: number) {\n this.notifyStatus(cstID);\n this.notifyValue(cstID);\n this.scheduleCoalescedEmitChange();\n }\n\n /** Notify all subscribers about value change. */\n private notifyValue(cstID: number) {\n const subs = this.valueSubscribers.get(cstID);\n if (subs) {\n for (const cb of subs) cb();\n }\n }\n\n /** Notify all subscribers about status change. */\n private notifyStatus(cstID: number) {\n const subs = this.statusSubscribers.get(cstID);\n if (subs) {\n for (const cb of subs) cb();\n }\n }\n\n /** Notify all subscribers about value and status change. */\n private notifyAll(): void {\n for (const subs of this.valueSubscribers.values()) {\n for (const cb of subs) cb();\n }\n for (const subs of this.statusSubscribers.values()) {\n for (const cb of subs) cb();\n }\n this.scheduleCoalescedEmitChange();\n }\n\n private scheduleCoalescedEmitChange(): void {\n this.pendingChange = true;\n if (this.coalescedEmitTimeout !== null) {\n return;\n }\n this.coalescedEmitTimeout = setTimeout(\n function runCoalescedEmitChange(this: RSEngine) {\n this.coalescedEmitTimeout = null;\n if (!this.pendingChange) {\n return;\n }\n this.pendingChange = false;\n this.emitChange();\n }.bind(this),\n 0\n );\n }\n\n private emitChange(): void {\n this.changeGeneration += 1;\n for (const cb of this.changeSubscribers) {\n cb();\n }\n }\n\n private prepareAst(): void {\n this.calculator.clearAllAst();\n const functions = this.schema!.items.filter(cst => isFunctional(cst.cst_type) && cst.analysis?.success);\n for (const cst of functions) {\n const fullAnalysis = getAnalysisFor(cst.definition_formal, cst.cst_type, this.schema!);\n if (fullAnalysis.ast) {\n this.calculator.setAST(cst.alias, fullAnalysis.ast);\n }\n }\n }\n\n private prepareValues(): void {\n this.basics.clear();\n this.invalidData.clear();\n this.calculatedSet.clear();\n\n for (const item of this.data!.items) {\n const cst = this.schema!.cstByID.get(item.id)!;\n if (item.type === TYPE_BASIC) {\n if (cst.cst_type !== CstType.BASE && cst.cst_type !== CstType.CONSTANT) {\n throw new Error(`Invalid data for ${cst.alias}`);\n }\n const data = item.value as BasicBinding;\n this.basics.set(cst.id, data);\n this.calculator.setValue(cst.alias, Object.keys(data).map(Number));\n }\n }\n for (const item of this.data!.items) {\n const cst = this.schema!.cstByID.get(item.id)!;\n if (item.type !== TYPE_BASIC) {\n this.calculator.setValue(cst.alias, item.value as Value);\n if (!cst.effectiveType || !this.calculator.validate(item.value as Value, cst.effectiveType)) {\n this.invalidData.add(item.id);\n }\n }\n }\n this.setupEmptySets();\n }\n\n private setupEmptySets(): void {\n for (const cst of this.schema!.items) {\n if (isBasicConcept(cst.cst_type) && this.schema!.analyzer.getType(cst.alias)?.typeID === TypeID.collection) {\n if (this.calculator.getValue(cst.alias) === null) {\n this.calculator.setValue(cst.alias, []);\n }\n }\n }\n }\n\n private collectChanged(previousSchema: RSForm | null, nextSchema: RSForm): number[] {\n if (!previousSchema) {\n return [];\n }\n const changedIDs: number[] = [];\n for (const cst of nextSchema.items) {\n const prev = previousSchema.cstByID.get(cst.id);\n if (prev && (prev.definition_formal !== cst.definition_formal || prev.alias !== cst.alias)) {\n changedIDs.push(cst.id);\n }\n }\n return changedIDs;\n }\n\n private onChangeDefinitions(cstIDs: number[]): void {\n if (!this.schema || cstIDs.length === 0) {\n return;\n }\n for (const cstID of cstIDs) {\n const cst = this.schema.cstByID.get(cstID);\n if (!cst || !isInferrable(cst.cst_type)) {\n continue;\n }\n this.calculatedSet.delete(cstID);\n this.calculator.resetValue(cst.alias);\n this.notifyCst(cstID);\n }\n this.cascadeReset(cstIDs);\n }\n\n private cascadeReset(cstIDs: number[]): void {\n if (!this.schema) {\n return;\n }\n const dependencies = this.schema.graph.expandAllOutputs(cstIDs);\n for (const cstID of dependencies) {\n const cst = this.schema.cstByID.get(cstID);\n if (!cst || !isInferrable(cst.cst_type)) {\n continue;\n }\n this.calculatedSet.delete(cstID);\n this.calculator.resetValue(this.schema.cstByID.get(cstID)!.alias);\n this.notifyCst(cstID);\n }\n }\n\n private prepareEvaluation(dependencies: number[]): void {\n for (const cstID of this.schema!.graph.topologicalOrder()) {\n if (dependencies.includes(cstID)) {\n const cst = this.schema!.cstByID.get(cstID)!;\n if (isInferrable(cst.cst_type)) {\n const value = fastEvaluation(cst.definition_formal, cst.cst_type, this.schema!, this.calculator, message =>\n this.notifications?.onEvaluationError(message)\n );\n if (value !== null) {\n this.calculator.setValue(cst.alias, value);\n } else {\n this.calculator.resetValue(cst.alias);\n }\n this.notifyCst(cstID);\n }\n this.calculatedSet.add(cstID);\n }\n }\n }\n\n private recalculateInternal(): void {\n const processedIDs = [];\n for (const cst of this.schema!.cstByID.values()) {\n if (isInferrable(cst.cst_type)) {\n this.calculator.resetValue(cst.alias);\n }\n }\n\n for (const cstID of this.schema!.graph.topologicalOrder()) {\n processedIDs.push(cstID);\n const cst = this.schema!.cstByID.get(cstID)!;\n if (isInferrable(cst.cst_type)) {\n const value = fastEvaluation(cst.definition_formal, cst.cst_type, this.schema!, this.calculator);\n this.calculatedSet.add(cstID);\n if (value !== null) {\n this.calculator.setValue(cst.alias, value);\n }\n }\n }\n this.notifyAll();\n }\n}\n\n// ==== Internal functions ==== /\n\n/** Evaluates expression for {@link Constituenta}, including error handling. */\nfunction getEvaluationFor(\n expression: string,\n cstType: CstType,\n schema: RSForm,\n calculator: RSCalculator,\n onEvaluationError?: (message: string) => void\n): CalculatorResult {\n const parse = getAnalysisFor(expression, cstType, schema);\n if (!parse.success || !parse.ast) {\n return {\n value: null,\n iterations: 0,\n cacheHits: 0,\n errors: parse.errors\n };\n } else {\n try {\n const result = calculator.evaluateFull(parse.ast);\n return {\n value: result.value,\n iterations: result.iterations,\n cacheHits: result.cacheHits,\n errors: [...parse.errors, ...result.errors]\n };\n } catch (error) {\n onEvaluationError?.((error as Error).message);\n console.error(expression, error);\n return {\n value: null,\n iterations: 0,\n cacheHits: 0,\n errors: []\n };\n }\n }\n}\n\n/** Evaluates expression for {@link RSModel}. */\nfunction fastEvaluation(\n expression: string,\n cstType: CstType,\n schema: RSForm,\n calculator: RSCalculator,\n onEvaluationError?: (message: string) => void\n): Value | null {\n const parse = getAnalysisFor(expression, cstType, schema);\n if (!parse.success || !parse.ast) {\n return null;\n } else {\n try {\n return calculator.evaluateFast(parse.ast);\n } catch (error) {\n onEvaluationError?.((error as Error).message);\n console.error(expression, error);\n return null;\n }\n }\n}\n"],"mappings":"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","names":["nodeId","tuple","tuple","component","tuple","set","component","LocalContext","parser","node","wasChanged"]}