@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/shared/hash.ts","../../../src/rslang/semantic/typification.ts","../../../src/rslang/eval/value.ts","../../../src/rslang/eval/value-api.ts"],"sourcesContent":["/** 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","/**\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","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"],"mappings":"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","names":["i"]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/rslang/semantic/typification.ts","../../../src/rslang/eval/value-api.ts","../../../src/rslang/eval/value.ts"],"sourcesContent":["/*\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"],"mappings":"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","names":[]}