@rsconcept/domain 1.3.0 → 1.4.1
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.
- package/dist/{analyzer-DlSq3Y3r.d.ts → analyzer-BliNe3pV.d.ts} +2 -2
- package/dist/{ast-annotations-BiMjkKvz.d.ts → ast-annotations-GOkbNN8F.d.ts} +2 -2
- package/dist/{calculator-C9W2jkSx.d.ts → calculator-DFevxZyV.d.ts} +3 -3
- package/dist/{error-E1LVq_3w.d.ts → error-deey7EiC.d.ts} +2 -1
- package/dist/index.d.ts +7 -7
- package/dist/index.js +2 -2
- package/dist/library/rsengine.d.ts +2 -3
- package/dist/library/rsengine.js +15 -43
- package/dist/library/rsengine.js.map +1 -1
- package/dist/library/rsform-api.d.ts +1 -1
- package/dist/library/rsform.d.ts +1 -1
- package/dist/library/rsmodel-api.d.ts +1 -1
- package/dist/library/rsmodel-api.js +1 -1
- package/dist/library/rsmodel.d.ts +1 -1
- package/dist/rslang/ast-annotations.d.ts +1 -1
- package/dist/rslang/error.d.ts +1 -1
- package/dist/rslang/error.js +1 -0
- package/dist/rslang/error.js.map +1 -1
- package/dist/rslang/eval/calculator.d.ts +1 -1
- package/dist/rslang/eval/calculator.js +1 -1
- package/dist/rslang/eval/evaluation-cache.d.ts +1 -1
- package/dist/rslang/eval/evaluator.d.ts +2 -2
- package/dist/rslang/eval/evaluator.js +17 -11
- package/dist/rslang/eval/evaluator.js.map +1 -1
- package/dist/rslang/eval/value-api.d.ts +1 -1
- package/dist/rslang/eval/value-api.js +1 -1
- package/dist/rslang/eval/value.d.ts +2 -2
- package/dist/rslang/eval/value.js +2 -2
- package/dist/rslang/index.d.ts +6 -6
- package/dist/rslang/index.js +1 -1
- package/dist/rslang/parser/syntax-errors.d.ts +1 -1
- package/dist/rslang/semantic/analyzer.d.ts +1 -1
- package/dist/rslang/semantic/type-auditor.d.ts +1 -1
- package/dist/rslang/semantic/value-auditor.d.ts +1 -1
- package/dist/{value-CTjX6825.d.ts → value-BduA_ZGp.d.ts} +8 -2
- package/dist/{value-api-Bw-SgaYY.d.ts → value-api-B6T6f4Ia.d.ts} +2 -2
- package/dist/{value-B8UtCqaK.js → value-ybFBRuz6.js} +14 -3
- package/dist/{value-B8UtCqaK.js.map → value-ybFBRuz6.js.map} +1 -1
- package/package.json +4 -4
- package/src/index.ts +1 -1
- package/src/library/rsengine.ts +14 -59
- package/src/rslang/error.ts +1 -0
- package/src/rslang/eval/calculator.test.ts +8 -0
- package/src/rslang/eval/evaluator.test.ts +5 -1
- package/src/rslang/eval/evaluator.ts +22 -13
- package/src/rslang/eval/value.ts +14 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"evaluator.js","names":[],"sources":["../../../src/rslang/eval/evaluator.ts"],"sourcesContent":["/**\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"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"evaluator.js","names":[],"sources":["../../../src/rslang/eval/evaluator.ts"],"sourcesContent":["/**\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 CalcInvalidDataError,\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 try {\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 } catch (error) {\n if (error instanceof CalcInvalidDataError) {\n return this.onError(RSErrorCode.calcInvalidData, node, [error.left, error.right]);\n }\n this.onError(RSErrorCode.calcUnknownError, node);\n return null;\n }\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) ?? null;\n if (value === null) {\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 const value = this.locals.findLocal(alias);\n if (value === null) {\n return this.onError(RSErrorCode.localUndeclared, node, [alias]);\n }\n return value;\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 findLocal(alias: string): Value | null {\n return this.data.get(alias)?.value ?? null;\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"],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { _ as setSymDiff, a as extractValue, b as validateValue, c as isTupleValue, d as printValue, f as projection, g as setNestedValue, h as setIntersection, i as convertPathToType, l as makeDefaultValue, m as setDiff, n as cartesianProduct, o as isSetValue, p as reduce, r as contains, s as isSubsetOrEq, t as boolean, u as normalizeValue, v as setUnion, x as valueStub, y as testInvalid } from "../../value-api-
|
|
1
|
+
import { _ as setSymDiff, a as extractValue, b as validateValue, c as isTupleValue, d as printValue, f as projection, g as setNestedValue, h as setIntersection, i as convertPathToType, l as makeDefaultValue, m as setDiff, n as cartesianProduct, o as isSetValue, p as reduce, r as contains, s as isSubsetOrEq, t as boolean, u as normalizeValue, v as setUnion, x as valueStub, y as testInvalid } from "../../value-api-B6T6f4Ia.js";
|
|
2
2
|
export { boolean, cartesianProduct, contains, convertPathToType, extractValue, isSetValue, isSubsetOrEq, isTupleValue, makeDefaultValue, normalizeValue, printValue, projection, reduce, setDiff, setIntersection, setNestedValue, setSymDiff, setUnion, testInvalid, validateValue, valueStub };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { A as
|
|
1
|
+
import { A as setUnion, C as printValue, D as setIntersection, E as setDiff, M as validateValue, N as valueStub, O as setNestedValue, S as normalizeValue, T as reduce, _ as extractValue, b as isTupleValue, g as convertPathToType, h as contains, j as testInvalid, k as setSymDiff, m as cartesianProduct, p as boolean, v as isSetValue, w as projection, x as makeDefaultValue, y as isSubsetOrEq } from "../../value-ybFBRuz6.js";
|
|
2
2
|
export { boolean, cartesianProduct, contains, convertPathToType, extractValue, isSetValue, isSubsetOrEq, isTupleValue, makeDefaultValue, normalizeValue, printValue, projection, reduce, setDiff, setIntersection, setNestedValue, setSymDiff, setUnion, testInvalid, validateValue, valueStub };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { BOOL_INFINITY, EmptySetV, INVALID_ELEMENT, SET_INFINITY, TUPLE_ID, VALUE_FALSE, VALUE_TRUE, Value, ValueContext, ValuePath, compare, makeValuePath, set, tuple };
|
|
1
|
+
import { a as SET_INFINITY, c as VALUE_TRUE, d as ValuePath, f as compare, h as tuple, i as INVALID_ELEMENT, l as Value, m as set, n as CalcInvalidDataError, o as TUPLE_ID, p as makeValuePath, r as EmptySetV, s as VALUE_FALSE, t as BOOL_INFINITY, u as ValueContext } from "../../value-BduA_ZGp.js";
|
|
2
|
+
export { BOOL_INFINITY, CalcInvalidDataError, EmptySetV, INVALID_ELEMENT, SET_INFINITY, TUPLE_ID, VALUE_FALSE, VALUE_TRUE, Value, ValueContext, ValuePath, compare, makeValuePath, set, tuple };
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as
|
|
2
|
-
export { BOOL_INFINITY, EmptySetV, INVALID_ELEMENT, SET_INFINITY, TUPLE_ID, VALUE_FALSE, VALUE_TRUE, compare, makeValuePath, set, tuple };
|
|
1
|
+
import { a as SET_INFINITY, c as VALUE_TRUE, d as set, f as tuple, i as INVALID_ELEMENT, l as compare, n as CalcInvalidDataError, o as TUPLE_ID, r as EmptySetV, s as VALUE_FALSE, t as BOOL_INFINITY, u as makeValuePath } from "../../value-ybFBRuz6.js";
|
|
2
|
+
export { BOOL_INFINITY, CalcInvalidDataError, EmptySetV, INVALID_ELEMENT, SET_INFINITY, TUPLE_ID, VALUE_FALSE, VALUE_TRUE, compare, makeValuePath, set, tuple };
|
package/dist/rslang/index.d.ts
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
1
|
import { O as makeTypePath, b as Typification, d as EmptySetT, f as ExpressionType, g as TypeClass, m as LogicT, t as AnyTypificationT, v as TypeID, y as TypePath } from "../typification-Dk-fisgO.js";
|
|
2
|
-
import { i as RSErrorDescription, r as RSErrorCode } from "../error-
|
|
3
|
-
import { i as readTypeAnnotation, r as readErrorAnnotation } from "../ast-annotations-
|
|
4
|
-
import {
|
|
5
|
-
import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-
|
|
6
|
-
import { d as printValue } from "../value-api-
|
|
2
|
+
import { i as RSErrorDescription, r as RSErrorCode } from "../error-deey7EiC.js";
|
|
3
|
+
import { i as readTypeAnnotation, r as readErrorAnnotation } from "../ast-annotations-GOkbNN8F.js";
|
|
4
|
+
import { d as ValuePath, l as Value, p as makeValuePath } from "../value-BduA_ZGp.js";
|
|
5
|
+
import { n as CalculatorResult, r as RSCalculator, t as CalculatorEvaluateOptions } from "../calculator-DFevxZyV.js";
|
|
6
|
+
import { d as printValue } from "../value-api-B6T6f4Ia.js";
|
|
7
7
|
import { t as parser } from "../parser-Bwd8LxJ1.js";
|
|
8
8
|
import { t as TokenID } from "../token-DeXAmzwr.js";
|
|
9
9
|
import { t as ValueClass } from "../value-class-CNI-lqXJ.js";
|
|
10
|
-
import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-
|
|
10
|
+
import { a as RSLangAnalyzer, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../analyzer-BliNe3pV.js";
|
|
11
11
|
import { n as ArgumentsType } from "../arguments-extractor-1acwjQNc.js";
|
|
12
12
|
import { n as applyAsciiTypeSubstitutions, r as parseTypeText } from "../typification-parser-BBVx1RxP.js";
|
|
13
13
|
import { n as TypificationNodeData, t as TypificationGraph } from "../typification-graph-6HcZ-rKH.js";
|
package/dist/rslang/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { readErrorAnnotation, readTypeAnnotation } from "./ast-annotations.js";
|
|
|
2
2
|
import { RSErrorCode } from "./error.js";
|
|
3
3
|
import { TokenID } from "./parser/token.js";
|
|
4
4
|
import { AnyTypificationT, EmptySetT, LogicT, TypeClass, TypeID, makeTypePath } from "./semantic/typification.js";
|
|
5
|
-
import {
|
|
5
|
+
import { C as printValue, u as makeValuePath } from "../value-ybFBRuz6.js";
|
|
6
6
|
import { RSCalculator } from "./eval/calculator.js";
|
|
7
7
|
import { parser } from "./parser/parser.js";
|
|
8
8
|
import { ValueClass } from "./semantic/value-class.js";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as AstNode } from "../../ast-C8sIpKdL.js";
|
|
2
|
-
import { t as ErrorReporter } from "../../error-
|
|
2
|
+
import { t as ErrorReporter } from "../../error-deey7EiC.js";
|
|
3
3
|
|
|
4
4
|
//#region src/rslang/parser/syntax-errors.d.ts
|
|
5
5
|
declare function extractSyntaxErrors(ast: AstNode, expression: string, reporter: ErrorReporter, annotateErrors?: boolean): void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { a as RSLangAnalyzer, i as AnalysisOptions, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../../analyzer-
|
|
1
|
+
import { a as RSLangAnalyzer, i as AnalysisOptions, n as AnalysisFast, r as AnalysisFull, t as AnalysisBase } from "../../analyzer-BliNe3pV.js";
|
|
2
2
|
export { AnalysisBase, AnalysisFast, AnalysisFull, AnalysisOptions, RSLangAnalyzer };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { t as AstNode } from "../../ast-C8sIpKdL.js";
|
|
2
2
|
import { _ as TypeContext, f as ExpressionType } from "../../typification-Dk-fisgO.js";
|
|
3
|
-
import { t as ErrorReporter } from "../../error-
|
|
3
|
+
import { t as ErrorReporter } from "../../error-deey7EiC.js";
|
|
4
4
|
|
|
5
5
|
//#region src/rslang/semantic/type-auditor.d.ts
|
|
6
6
|
/** Type auditor for AST type checking. */
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { t as AstNode } from "../../ast-C8sIpKdL.js";
|
|
2
|
-
import { t as ErrorReporter } from "../../error-
|
|
2
|
+
import { t as ErrorReporter } from "../../error-deey7EiC.js";
|
|
3
3
|
import { n as ValueClassContext, t as ValueClass } from "../../value-class-CNI-lqXJ.js";
|
|
4
4
|
|
|
5
5
|
//#region src/rslang/semantic/value-auditor.d.ts
|
|
@@ -22,6 +22,12 @@ type ValuePath = Branded<number[], 'ValuePath'>;
|
|
|
22
22
|
declare function makeValuePath(path: number[]): ValuePath;
|
|
23
23
|
/** Empty set ∅. */
|
|
24
24
|
declare const EmptySetV: never[];
|
|
25
|
+
/** Thrown when a runtime value operation cannot be applied to the given operands. */
|
|
26
|
+
declare class CalcInvalidDataError extends Error {
|
|
27
|
+
readonly left: string;
|
|
28
|
+
readonly right: string;
|
|
29
|
+
constructor(left: string, right: string);
|
|
30
|
+
}
|
|
25
31
|
/** Compare two structured data without recursive calls. */
|
|
26
32
|
declare function compare(v1: Value, v2: Value): number;
|
|
27
33
|
/** Tuple from components. */
|
|
@@ -29,5 +35,5 @@ declare function tuple(components: Value[]): Value;
|
|
|
29
35
|
/** Set from elements (unique). Value[] - materialized. */
|
|
30
36
|
declare function set(elements: Value[]): Value[];
|
|
31
37
|
//#endregion
|
|
32
|
-
export {
|
|
33
|
-
//# sourceMappingURL=value-
|
|
38
|
+
export { SET_INFINITY as a, VALUE_TRUE as c, ValuePath as d, compare as f, tuple as h, INVALID_ELEMENT as i, Value as l, set as m, CalcInvalidDataError as n, TUPLE_ID as o, makeValuePath as p, EmptySetV as r, VALUE_FALSE as s, BOOL_INFINITY as t, ValueContext as u };
|
|
39
|
+
//# sourceMappingURL=value-BduA_ZGp.d.ts.map
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { b as Typification, f as ExpressionType, y as TypePath } from "./typification-Dk-fisgO.js";
|
|
2
|
-
import {
|
|
2
|
+
import { d as ValuePath, l as Value, u as ValueContext } from "./value-BduA_ZGp.js";
|
|
3
3
|
|
|
4
4
|
//#region src/rslang/eval/value-api.d.ts
|
|
5
5
|
/** Cartesian product of factor sets. */
|
|
@@ -46,4 +46,4 @@ declare function setNestedValue(target: Value | null, path: ValuePath, newVal: V
|
|
|
46
46
|
declare function testInvalid(value: Value): boolean;
|
|
47
47
|
//#endregion
|
|
48
48
|
export { setSymDiff as _, extractValue as a, validateValue as b, isTupleValue as c, printValue as d, projection as f, setNestedValue as g, setIntersection as h, convertPathToType as i, makeDefaultValue as l, setDiff as m, cartesianProduct as n, isSetValue as o, reduce as p, contains as r, isSubsetOrEq as s, boolean as t, normalizeValue as u, setUnion as v, valueStub as x, testInvalid as y };
|
|
49
|
-
//# sourceMappingURL=value-api-
|
|
49
|
+
//# sourceMappingURL=value-api-B6T6f4Ia.d.ts.map
|
|
@@ -323,6 +323,17 @@ function makeValuePath(path) {
|
|
|
323
323
|
}
|
|
324
324
|
/** Empty set ∅. */
|
|
325
325
|
const EmptySetV = [];
|
|
326
|
+
/** Thrown when a runtime value operation cannot be applied to the given operands. */
|
|
327
|
+
var CalcInvalidDataError = class extends Error {
|
|
328
|
+
left;
|
|
329
|
+
right;
|
|
330
|
+
constructor(left, right) {
|
|
331
|
+
super(`Cannot compare different types ${left} and ${right}`);
|
|
332
|
+
this.name = "CalcInvalidDataError";
|
|
333
|
+
this.left = left;
|
|
334
|
+
this.right = right;
|
|
335
|
+
}
|
|
336
|
+
};
|
|
326
337
|
/** Compare two structured data without recursive calls. */
|
|
327
338
|
function compare(v1, v2) {
|
|
328
339
|
const stack1 = [v1];
|
|
@@ -336,7 +347,7 @@ function compare(v1, v2) {
|
|
|
336
347
|
if (numDiff !== 0) return numDiff;
|
|
337
348
|
continue;
|
|
338
349
|
}
|
|
339
|
-
if (!Array.isArray(el1) || !Array.isArray(el2)) throw new
|
|
350
|
+
if (!Array.isArray(el1) || !Array.isArray(el2)) throw new CalcInvalidDataError(printValue(el1), printValue(el2));
|
|
340
351
|
const arr1 = el1;
|
|
341
352
|
const arr2 = el2;
|
|
342
353
|
const len1 = arr1.length;
|
|
@@ -361,6 +372,6 @@ function set(elements) {
|
|
|
361
372
|
return sorted;
|
|
362
373
|
}
|
|
363
374
|
//#endregion
|
|
364
|
-
export {
|
|
375
|
+
export { setUnion as A, printValue as C, setIntersection as D, setDiff as E, validateValue as M, valueStub as N, setNestedValue as O, normalizeValue as S, reduce as T, extractValue as _, SET_INFINITY as a, isTupleValue as b, VALUE_TRUE as c, set as d, tuple as f, convertPathToType as g, contains as h, INVALID_ELEMENT as i, testInvalid as j, setSymDiff as k, compare as l, cartesianProduct as m, CalcInvalidDataError as n, TUPLE_ID as o, boolean as p, EmptySetV as r, VALUE_FALSE as s, BOOL_INFINITY as t, makeValuePath as u, isSetValue as v, projection as w, makeDefaultValue as x, isSubsetOrEq as y };
|
|
365
376
|
|
|
366
|
-
//# sourceMappingURL=value-
|
|
377
|
+
//# sourceMappingURL=value-ybFBRuz6.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"value-B8UtCqaK.js","names":[],"sources":["../src/rslang/eval/value-api.ts","../src/rslang/eval/value.ts"],"sourcesContent":["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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"}
|
|
1
|
+
{"version":3,"file":"value-ybFBRuz6.js","names":[],"sources":["../src/rslang/eval/value-api.ts","../src/rslang/eval/value.ts"],"sourcesContent":["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/** Thrown when a runtime value operation cannot be applied to the given operands. */\nexport class CalcInvalidDataError extends Error {\n readonly left: string;\n readonly right: string;\n\n constructor(left: string, right: string) {\n super(`Cannot compare different types ${left} and ${right}`);\n this.name = 'CalcInvalidDataError';\n this.left = left;\n this.right = right;\n }\n}\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 CalcInvalidDataError(printValue(el1!), 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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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rsconcept/domain",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.1",
|
|
4
4
|
"description": "Shared TypeScript domain for RS language, RSForm, RSModel, RSEngine, OSS, and concept-text helpers.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "IRBorisov",
|
|
@@ -167,15 +167,15 @@
|
|
|
167
167
|
},
|
|
168
168
|
"devDependencies": {
|
|
169
169
|
"@lezer/generator": "^1.8.0",
|
|
170
|
-
"@types/node": "^25.9.
|
|
170
|
+
"@types/node": "^25.9.4",
|
|
171
171
|
"@typescript-eslint/parser": "^8.0.1",
|
|
172
172
|
"eslint": "^9.39.4",
|
|
173
173
|
"eslint-plugin-simple-import-sort": "^13.0.0",
|
|
174
174
|
"globals": "^17.6.0",
|
|
175
175
|
"prettier": "^3.8.4",
|
|
176
|
-
"tsdown": "^0.22.
|
|
176
|
+
"tsdown": "^0.22.3",
|
|
177
177
|
"typescript": "^6.0.3",
|
|
178
|
-
"typescript-eslint": "^8.61.
|
|
178
|
+
"typescript-eslint": "^8.61.1",
|
|
179
179
|
"vitest": "^4.1.9"
|
|
180
180
|
},
|
|
181
181
|
"publishConfig": {
|
package/src/index.ts
CHANGED
|
@@ -72,7 +72,7 @@ export { type CMSyntaxNode, printTree } from './parsing/lezer-tree';
|
|
|
72
72
|
export { readErrorAnnotation, readTypeAnnotation } from './rslang/ast-annotations';
|
|
73
73
|
export { RSErrorCode, type RSErrorDescription } from './rslang/error';
|
|
74
74
|
export { type CalculatorEvaluateOptions, type CalculatorResult, RSCalculator } from './rslang/eval/calculator';
|
|
75
|
-
export { makeValuePath, type Value, type ValuePath } from './rslang/eval/value';
|
|
75
|
+
export { makeValuePath, TUPLE_ID, type Value, type ValuePath } from './rslang/eval/value';
|
|
76
76
|
export { printValue } from './rslang/eval/value-api';
|
|
77
77
|
export { parser as rslangParser } from './rslang/parser/parser';
|
|
78
78
|
export { TokenID } from './rslang/parser/token';
|