@kalada/core 0.2.0 → 0.4.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 (140) hide show
  1. package/README.md +62 -3
  2. package/dist/kalada-v1/canonical-input.cjs +133 -0
  3. package/dist/kalada-v1/canonical-input.cjs.map +1 -0
  4. package/dist/kalada-v1/canonical-input.d.cts +26 -0
  5. package/dist/kalada-v1/canonical-input.d.ts +26 -0
  6. package/dist/kalada-v1/canonical-input.js +122 -0
  7. package/dist/kalada-v1/canonical-input.js.map +1 -0
  8. package/dist/kalada-v1/canonicalize.cjs +93 -130
  9. package/dist/kalada-v1/canonicalize.cjs.map +1 -1
  10. package/dist/kalada-v1/canonicalize.d.cts +1 -0
  11. package/dist/kalada-v1/canonicalize.d.ts +1 -0
  12. package/dist/kalada-v1/canonicalize.js +71 -108
  13. package/dist/kalada-v1/canonicalize.js.map +1 -1
  14. package/dist/kalada-v1/codec.cjs +24 -0
  15. package/dist/kalada-v1/codec.cjs.map +1 -1
  16. package/dist/kalada-v1/codec.d.cts +5 -0
  17. package/dist/kalada-v1/codec.d.ts +5 -0
  18. package/dist/kalada-v1/codec.js +24 -0
  19. package/dist/kalada-v1/codec.js.map +1 -1
  20. package/dist/kalada-v1/compile.cjs +24 -1
  21. package/dist/kalada-v1/compile.cjs.map +1 -1
  22. package/dist/kalada-v1/compile.d.cts +1 -0
  23. package/dist/kalada-v1/compile.d.ts +1 -0
  24. package/dist/kalada-v1/compile.js +25 -2
  25. package/dist/kalada-v1/compile.js.map +1 -1
  26. package/dist/kalada-v1/dependencies.cjs +55 -2
  27. package/dist/kalada-v1/dependencies.cjs.map +1 -1
  28. package/dist/kalada-v1/dependencies.d.cts +1 -0
  29. package/dist/kalada-v1/dependencies.d.ts +1 -0
  30. package/dist/kalada-v1/dependencies.js +55 -2
  31. package/dist/kalada-v1/dependencies.js.map +1 -1
  32. package/dist/kalada-v1/diagnostics.cjs +29 -4
  33. package/dist/kalada-v1/diagnostics.cjs.map +1 -1
  34. package/dist/kalada-v1/diagnostics.d.cts +5 -3
  35. package/dist/kalada-v1/diagnostics.d.ts +5 -3
  36. package/dist/kalada-v1/diagnostics.js +29 -4
  37. package/dist/kalada-v1/diagnostics.js.map +1 -1
  38. package/dist/kalada-v1/evaluate.cjs +23 -117
  39. package/dist/kalada-v1/evaluate.cjs.map +1 -1
  40. package/dist/kalada-v1/evaluate.d.cts +4 -2
  41. package/dist/kalada-v1/evaluate.d.ts +4 -2
  42. package/dist/kalada-v1/evaluate.js +24 -118
  43. package/dist/kalada-v1/evaluate.js.map +1 -1
  44. package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
  45. package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
  46. package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
  47. package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
  48. package/dist/kalada-v1/evaluation-delivery.js +284 -0
  49. package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
  50. package/dist/kalada-v1/evaluation-frames.cjs +16 -0
  51. package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
  52. package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
  53. package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
  54. package/dist/kalada-v1/evaluation-frames.js +14 -0
  55. package/dist/kalada-v1/evaluation-frames.js.map +1 -0
  56. package/dist/kalada-v1/evaluation-machine.cjs +226 -0
  57. package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
  58. package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
  59. package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
  60. package/dist/kalada-v1/evaluation-machine.js +224 -0
  61. package/dist/kalada-v1/evaluation-machine.js.map +1 -0
  62. package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
  63. package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
  64. package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
  65. package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
  66. package/dist/kalada-v1/evaluation-resolution.js +78 -0
  67. package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
  68. package/dist/kalada-v1/evaluation-state.cjs +94 -0
  69. package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
  70. package/dist/kalada-v1/evaluation-state.d.cts +38 -0
  71. package/dist/kalada-v1/evaluation-state.d.ts +38 -0
  72. package/dist/kalada-v1/evaluation-state.js +81 -0
  73. package/dist/kalada-v1/evaluation-state.js.map +1 -0
  74. package/dist/kalada-v1/factories.cjs +46 -0
  75. package/dist/kalada-v1/factories.cjs.map +1 -1
  76. package/dist/kalada-v1/factories.d.cts +24 -1
  77. package/dist/kalada-v1/factories.d.ts +24 -1
  78. package/dist/kalada-v1/factories.js +46 -0
  79. package/dist/kalada-v1/factories.js.map +1 -1
  80. package/dist/kalada-v1/function-contracts.cjs +150 -0
  81. package/dist/kalada-v1/function-contracts.cjs.map +1 -0
  82. package/dist/kalada-v1/function-contracts.d.cts +15 -0
  83. package/dist/kalada-v1/function-contracts.d.ts +15 -0
  84. package/dist/kalada-v1/function-contracts.js +144 -0
  85. package/dist/kalada-v1/function-contracts.js.map +1 -0
  86. package/dist/kalada-v1/index.cjs +30 -0
  87. package/dist/kalada-v1/index.d.cts +5 -3
  88. package/dist/kalada-v1/index.d.ts +5 -3
  89. package/dist/kalada-v1/index.js +4 -2
  90. package/dist/kalada-v1/limits.cjs +23 -2
  91. package/dist/kalada-v1/limits.cjs.map +1 -1
  92. package/dist/kalada-v1/limits.d.cts +6 -3
  93. package/dist/kalada-v1/limits.d.ts +6 -3
  94. package/dist/kalada-v1/limits.js +23 -3
  95. package/dist/kalada-v1/limits.js.map +1 -1
  96. package/dist/kalada-v1/runtime-values.cjs +112 -0
  97. package/dist/kalada-v1/runtime-values.cjs.map +1 -0
  98. package/dist/kalada-v1/runtime-values.d.cts +35 -0
  99. package/dist/kalada-v1/runtime-values.d.ts +35 -0
  100. package/dist/kalada-v1/runtime-values.js +105 -0
  101. package/dist/kalada-v1/runtime-values.js.map +1 -0
  102. package/dist/kalada-v1/schemas.cjs +136 -3
  103. package/dist/kalada-v1/schemas.cjs.map +1 -1
  104. package/dist/kalada-v1/schemas.d.cts +2 -1
  105. package/dist/kalada-v1/schemas.d.ts +2 -1
  106. package/dist/kalada-v1/schemas.js +137 -5
  107. package/dist/kalada-v1/schemas.js.map +1 -1
  108. package/dist/kalada-v1/static-analysis.cjs +177 -0
  109. package/dist/kalada-v1/static-analysis.cjs.map +1 -0
  110. package/dist/kalada-v1/static-analysis.d.cts +9 -0
  111. package/dist/kalada-v1/static-analysis.d.ts +9 -0
  112. package/dist/kalada-v1/static-analysis.js +175 -0
  113. package/dist/kalada-v1/static-analysis.js.map +1 -0
  114. package/dist/kalada-v1/static-types.cjs +229 -0
  115. package/dist/kalada-v1/static-types.cjs.map +1 -0
  116. package/dist/kalada-v1/static-types.d.cts +8 -0
  117. package/dist/kalada-v1/static-types.d.ts +8 -0
  118. package/dist/kalada-v1/static-types.js +227 -0
  119. package/dist/kalada-v1/static-types.js.map +1 -0
  120. package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
  121. package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
  122. package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
  123. package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
  124. package/dist/kalada-v1/temporal-evaluation.js +90 -0
  125. package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
  126. package/dist/kalada-v1/temporal.cjs +42 -0
  127. package/dist/kalada-v1/temporal.cjs.map +1 -0
  128. package/dist/kalada-v1/temporal.d.cts +22 -0
  129. package/dist/kalada-v1/temporal.d.ts +22 -0
  130. package/dist/kalada-v1/temporal.js +37 -0
  131. package/dist/kalada-v1/temporal.js.map +1 -0
  132. package/dist/kalada-v1/types.d.cts +108 -5
  133. package/dist/kalada-v1/types.d.ts +108 -5
  134. package/dist/kalada-v1/values.cjs +13 -1
  135. package/dist/kalada-v1/values.cjs.map +1 -1
  136. package/dist/kalada-v1/values.d.cts +2 -1
  137. package/dist/kalada-v1/values.d.ts +2 -1
  138. package/dist/kalada-v1/values.js +13 -1
  139. package/dist/kalada-v1/values.js.map +1 -1
  140. package/package.json +1 -1
@@ -0,0 +1,224 @@
1
+ import { KaladaFailure } from './diagnostics.js';
2
+ import { deliverFrame } from './evaluation-delivery.js';
3
+ import { resolveReference } from './evaluation-resolution.js';
4
+ import { captureMap, diagnosticContext, unwind, fail, charge, deliver, push, evaluate, reserveClosure, copyCaptures } from './evaluation-state.js';
5
+ import { isCallable, coreCallable, closureFromMember, closureFromExpression } from './runtime-values.js';
6
+ import { temporalLeaf } from './temporal-evaluation.js';
7
+ import { Option } from './values.js';
8
+
9
+ const FUNCTION_RUNTIME_DIAGNOSTICS = /* @__PURE__ */ new Set([
10
+ "KALADA_CAPTURE_LIMIT",
11
+ "KALADA_NOT_CALLABLE",
12
+ "KALADA_FUNCTION_ARITY",
13
+ "KALADA_FUNCTION_TYPE_MISMATCH",
14
+ "KALADA_CLOSURE_LIMIT",
15
+ "KALADA_CALL_DEPTH_LIMIT",
16
+ "KALADA_CONTINUATION_LIMIT",
17
+ "KALADA_COLLECTION_TYPE_MISMATCH",
18
+ "KALADA_COLLECTION_LIMIT",
19
+ "KALADA_FUNCTION_ESCAPE"
20
+ ]);
21
+ function runEvaluation(expression, resolve, limits, functions, instant) {
22
+ const environment = /* @__PURE__ */ new Map();
23
+ const state = {
24
+ resolve,
25
+ limits,
26
+ captures: captureMap(functions),
27
+ instant,
28
+ stack: [],
29
+ task: { node: expression, path: ["expression"], environment },
30
+ value: null,
31
+ environment,
32
+ steps: 0,
33
+ closures: 0,
34
+ captured: 0,
35
+ callDepth: 0,
36
+ collectionIterations: 0
37
+ };
38
+ try {
39
+ return runLoop(state);
40
+ } catch (error) {
41
+ if (!(error instanceof KaladaFailure) || error.context) throw error;
42
+ const context = diagnosticContext(state);
43
+ const includeContext = context.length > 0 || FUNCTION_RUNTIME_DIAGNOSTICS.has(error.code);
44
+ unwind(state);
45
+ throw new KaladaFailure(error.code, error.path, includeContext ? context : void 0);
46
+ }
47
+ }
48
+ function runLoop(state) {
49
+ while (true) {
50
+ const result = advance(state);
51
+ if (result !== void 0) return result;
52
+ }
53
+ }
54
+ function advance(state) {
55
+ if (state.task) {
56
+ evaluateTask(state);
57
+ return void 0;
58
+ }
59
+ if (state.stack.length > 0) {
60
+ deliverFrame(state);
61
+ return void 0;
62
+ }
63
+ const value = state.value;
64
+ if (isCallable(value)) fail("KALADA_FUNCTION_ESCAPE", ["expression"]);
65
+ return value;
66
+ }
67
+ function evaluateTask(state) {
68
+ const task = state.task;
69
+ state.task = null;
70
+ state.environment = task.environment;
71
+ charge(task.path, state);
72
+ const { node, path } = task;
73
+ switch (node.kind) {
74
+ case "literal":
75
+ deliver(node.value, state);
76
+ break;
77
+ case "ref":
78
+ evaluateReference(node.ref, path, state);
79
+ break;
80
+ case "binding":
81
+ enterBinding(node, path, state);
82
+ break;
83
+ case "option":
84
+ case "result":
85
+ enterConstructor(node, path, state);
86
+ break;
87
+ case "match":
88
+ enterMatch(node, path, state);
89
+ break;
90
+ case "function":
91
+ deliver(materializeFunction(node, path, state), state);
92
+ break;
93
+ case "function-group":
94
+ enterGroup(node, path, state);
95
+ break;
96
+ case "call":
97
+ enterCall(node, path, state);
98
+ break;
99
+ case "core-function":
100
+ deliver(coreCallable(node.name), state);
101
+ break;
102
+ case "temporal-arithmetic":
103
+ case "temporal-comparison":
104
+ enterTemporal(node, path, state);
105
+ break;
106
+ default:
107
+ deliver(temporalLeaf(node, path, state.instant), state);
108
+ }
109
+ }
110
+ function evaluateReference(reference, path, state) {
111
+ if (typeof reference === "string" && state.environment.has(reference)) {
112
+ deliver(state.environment.get(reference), state);
113
+ return;
114
+ }
115
+ deliver(resolveReference(reference, path, state.resolve, state.limits), state);
116
+ }
117
+ function enterBinding(node, path, state) {
118
+ push(
119
+ {
120
+ kind: "binding",
121
+ phase: "value",
122
+ path,
123
+ name: node.name,
124
+ body: node.body,
125
+ outer: state.environment
126
+ },
127
+ [...path, "value"],
128
+ state
129
+ );
130
+ evaluate(node.value, [...path, "value"], state.environment, state);
131
+ }
132
+ function enterConstructor(node, path, state) {
133
+ if (node.kind === "option" && node.variant === "none") {
134
+ deliver(Option.none(), state);
135
+ return;
136
+ }
137
+ const type = node.kind === "option" ? "Option" : "Result";
138
+ push(
139
+ { kind: "constructor", phase: "payload", path, type, variant: node.variant },
140
+ [...path, "value"],
141
+ state
142
+ );
143
+ evaluate(node.value, [...path, "value"], state.environment, state);
144
+ }
145
+ function enterMatch(node, path, state) {
146
+ push(
147
+ {
148
+ kind: "match",
149
+ phase: "scrutinee",
150
+ path,
151
+ type: node.type,
152
+ arms: node.arms,
153
+ outer: state.environment,
154
+ scrutinee: null,
155
+ selected: null
156
+ },
157
+ [...path, "value"],
158
+ state
159
+ );
160
+ evaluate(node.value, [...path, "value"], state.environment, state);
161
+ }
162
+ function enterTemporal(node, path, state) {
163
+ push(
164
+ {
165
+ kind: "temporal-binary",
166
+ phase: "left",
167
+ path,
168
+ expressionKind: node.kind,
169
+ operator: node.operator,
170
+ right: node.right,
171
+ left: null
172
+ },
173
+ [...path, "left"],
174
+ state
175
+ );
176
+ evaluate(node.left, [...path, "left"], state.environment, state);
177
+ }
178
+ function enterCall(node, path, state) {
179
+ push(
180
+ { kind: "call-callee", phase: "callee", path, arguments: node.arguments },
181
+ [...path, "callee"],
182
+ state
183
+ );
184
+ evaluate(node.callee, [...path, "callee"], state.environment, state);
185
+ }
186
+ function enterGroup(node, path, state) {
187
+ const names = Object.freeze(node.functions.map((item) => item.name));
188
+ const closures = [];
189
+ const recursive = { names, closures };
190
+ node.functions.forEach((member, index) => {
191
+ const memberPath = [...path, "functions", index];
192
+ reserveClosure(memberPath, state);
193
+ const captured = copyCaptures(memberPath, state);
194
+ closures.push(closureFromMember(member, memberPath, captured, recursive));
195
+ });
196
+ Object.freeze(closures);
197
+ Object.freeze(recursive);
198
+ const group = new Map(state.environment);
199
+ names.forEach((name, index) => {
200
+ group.set(name, closures[index]);
201
+ });
202
+ push(
203
+ {
204
+ kind: "function-group-body",
205
+ phase: "body",
206
+ path,
207
+ body: node.body,
208
+ outer: state.environment,
209
+ group
210
+ },
211
+ [...path, "body"],
212
+ state
213
+ );
214
+ evaluate(node.body, [...path, "body"], group, state);
215
+ }
216
+ function materializeFunction(node, path, state) {
217
+ reserveClosure(path, state);
218
+ const captures = copyCaptures(path, state);
219
+ return closureFromExpression(node, path, captures);
220
+ }
221
+
222
+ export { runEvaluation };
223
+ //# sourceMappingURL=evaluation-machine.js.map
224
+ //# sourceMappingURL=evaluation-machine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluation-machine.ts"],"names":[],"mappings":"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","file":"evaluation-machine.js","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport { deliverFrame } from \"./evaluation-delivery.js\";\nimport type { EvaluationTask, Path } from \"./evaluation-frames.js\";\nimport { resolveReference } from \"./evaluation-resolution.js\";\nimport {\n captureMap,\n charge,\n copyCaptures,\n deliver,\n diagnosticContext,\n evaluate,\n fail,\n type MachineState,\n push,\n reserveClosure,\n unwind,\n} from \"./evaluation-state.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport {\n closureFromExpression,\n closureFromMember,\n coreCallable,\n isCallable,\n type RecursiveEnvironment,\n type RuntimeValue,\n type UserClosure,\n} from \"./runtime-values.js\";\nimport type { InstantValue } from \"./temporal.js\";\nimport { temporalLeaf } from \"./temporal-evaluation.js\";\nimport type { KaladaV1Expression, KaladaV1FunctionCapture, KaladaV1Resolver } from \"./types.js\";\nimport { type KaladaValue, Option } from \"./values.js\";\n\nconst FUNCTION_RUNTIME_DIAGNOSTICS = new Set([\n \"KALADA_CAPTURE_LIMIT\",\n \"KALADA_NOT_CALLABLE\",\n \"KALADA_FUNCTION_ARITY\",\n \"KALADA_FUNCTION_TYPE_MISMATCH\",\n \"KALADA_CLOSURE_LIMIT\",\n \"KALADA_CALL_DEPTH_LIMIT\",\n \"KALADA_CONTINUATION_LIMIT\",\n \"KALADA_COLLECTION_TYPE_MISMATCH\",\n \"KALADA_COLLECTION_LIMIT\",\n \"KALADA_FUNCTION_ESCAPE\",\n]);\n\nexport function runEvaluation<R extends JsonValue>(\n expression: KaladaV1Expression<R>,\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n functions: readonly KaladaV1FunctionCapture[],\n instant: InstantValue | undefined,\n): KaladaValue {\n const environment = new Map<string, RuntimeValue>();\n const state: MachineState<R> = {\n resolve,\n limits,\n captures: captureMap(functions),\n instant,\n stack: [],\n task: { node: expression, path: [\"expression\"], environment },\n value: null,\n environment,\n steps: 0,\n closures: 0,\n captured: 0,\n callDepth: 0,\n collectionIterations: 0,\n };\n try {\n return runLoop(state);\n } catch (error) {\n if (!(error instanceof KaladaFailure) || error.context) throw error;\n const context = diagnosticContext(state);\n const includeContext = context.length > 0 || FUNCTION_RUNTIME_DIAGNOSTICS.has(error.code);\n unwind(state);\n throw new KaladaFailure(error.code, error.path, includeContext ? context : undefined);\n }\n}\n\nfunction runLoop<R extends JsonValue>(state: MachineState<R>): KaladaValue {\n while (true) {\n const result = advance(state);\n if (result !== undefined) return result;\n }\n}\n\nfunction advance<R extends JsonValue>(state: MachineState<R>): KaladaValue | undefined {\n if (state.task) {\n evaluateTask(state);\n return undefined;\n }\n if (state.stack.length > 0) {\n deliverFrame(state);\n return undefined;\n }\n const value = state.value as RuntimeValue;\n if (isCallable(value)) fail(\"KALADA_FUNCTION_ESCAPE\", [\"expression\"]);\n return value;\n}\n\nfunction evaluateTask<R extends JsonValue>(state: MachineState<R>): void {\n const task = state.task as EvaluationTask<R>;\n state.task = null;\n state.environment = task.environment;\n charge(task.path, state);\n const { node, path } = task;\n switch (node.kind) {\n case \"literal\":\n deliver(node.value, state);\n break;\n case \"ref\":\n evaluateReference(node.ref, path, state);\n break;\n case \"binding\":\n enterBinding(node, path, state);\n break;\n case \"option\":\n case \"result\":\n enterConstructor(node, path, state);\n break;\n case \"match\":\n enterMatch(node, path, state);\n break;\n case \"function\":\n deliver(materializeFunction(node, path, state), state);\n break;\n case \"function-group\":\n enterGroup(node, path, state);\n break;\n case \"call\":\n enterCall(node, path, state);\n break;\n case \"core-function\":\n deliver(coreCallable(node.name), state);\n break;\n case \"temporal-arithmetic\":\n case \"temporal-comparison\":\n enterTemporal(node, path, state);\n break;\n default:\n deliver(temporalLeaf(node, path, state.instant), state);\n }\n}\n\nfunction evaluateReference<R extends JsonValue>(\n reference: R,\n path: Path,\n state: MachineState<R>,\n): void {\n if (typeof reference === \"string\" && state.environment.has(reference)) {\n deliver(state.environment.get(reference) as RuntimeValue, state);\n return;\n }\n deliver(resolveReference(reference, path, state.resolve, state.limits), state);\n}\n\nfunction enterBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n push(\n {\n kind: \"binding\",\n phase: \"value\",\n path,\n name: node.name,\n body: node.body,\n outer: state.environment,\n },\n [...path, \"value\"],\n state,\n );\n evaluate(node.value, [...path, \"value\"], state.environment, state);\n}\n\nfunction enterConstructor<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"option\" | \"result\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n if (node.kind === \"option\" && node.variant === \"none\") {\n deliver(Option.none(), state);\n return;\n }\n const type = node.kind === \"option\" ? \"Option\" : \"Result\";\n push(\n { kind: \"constructor\", phase: \"payload\", path, type, variant: node.variant },\n [...path, \"value\"],\n state,\n );\n evaluate(node.value, [...path, \"value\"], state.environment, state);\n}\n\nfunction enterMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n push(\n {\n kind: \"match\",\n phase: \"scrutinee\",\n path,\n type: node.type,\n arms: node.arms,\n outer: state.environment,\n scrutinee: null,\n selected: null,\n },\n [...path, \"value\"],\n state,\n );\n evaluate(node.value, [...path, \"value\"], state.environment, state);\n}\n\nfunction enterTemporal<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"temporal-arithmetic\" | \"temporal-comparison\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n push(\n {\n kind: \"temporal-binary\",\n phase: \"left\",\n path,\n expressionKind: node.kind,\n operator: node.operator,\n right: node.right,\n left: null,\n },\n [...path, \"left\"],\n state,\n );\n evaluate(node.left, [...path, \"left\"], state.environment, state);\n}\n\nfunction enterCall<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"call\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n push(\n { kind: \"call-callee\", phase: \"callee\", path, arguments: node.arguments },\n [...path, \"callee\"],\n state,\n );\n evaluate(node.callee, [...path, \"callee\"], state.environment, state);\n}\n\nfunction enterGroup<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n path: Path,\n state: MachineState<R>,\n): void {\n const names = Object.freeze(node.functions.map((item) => item.name));\n const closures: UserClosure<R>[] = [];\n const recursive = { names, closures } as RecursiveEnvironment<R>;\n node.functions.forEach((member, index) => {\n const memberPath = [...path, \"functions\", index];\n reserveClosure(memberPath, state);\n const captured = copyCaptures(memberPath, state);\n closures.push(closureFromMember(member, memberPath, captured, recursive));\n });\n Object.freeze(closures);\n Object.freeze(recursive);\n const group = new Map(state.environment);\n names.forEach((name, index) => {\n group.set(name, closures[index] as UserClosure<R>);\n });\n push(\n {\n kind: \"function-group-body\",\n phase: \"body\",\n path,\n body: node.body,\n outer: state.environment,\n group,\n },\n [...path, \"body\"],\n state,\n );\n evaluate(node.body, [...path, \"body\"], group, state);\n}\n\nfunction materializeFunction<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function\" }>,\n path: Path,\n state: MachineState<R>,\n): UserClosure<R> {\n reserveClosure(path, state);\n const captures = copyCaptures(path, state);\n return closureFromExpression(node, path, captures);\n}\n"]}
@@ -0,0 +1,80 @@
1
+ 'use strict';
2
+
3
+ var callbackPromise_js = require('../kuery-v1/callback-promise.js');
4
+ var diagnostics_js = require('./diagnostics.js');
5
+ var json_js = require('./json.js');
6
+ var temporal_js = require('./temporal.js');
7
+ var values_js = require('./values.js');
8
+
9
+ function resolveReference(reference, path, resolve, limits) {
10
+ let input;
11
+ try {
12
+ input = resolve(reference);
13
+ } catch {
14
+ throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
15
+ }
16
+ if (callbackPromise_js.rejectCallbackPromise(input)) throw new diagnostics_js.KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
17
+ return parseResolution(input, path, limits);
18
+ }
19
+ function parseResolution(input, path, limits) {
20
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
21
+ throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
22
+ }
23
+ const keys = safeKeys(input, path);
24
+ const found = safeData(input, "found", path);
25
+ if (typeof found !== "boolean") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
26
+ if (!found) return missingResolution(input, keys, path);
27
+ if (keys.length !== 2 || !keys.includes("value")) failReference(path);
28
+ return safeValue(safeData(input, "value", path), path, limits);
29
+ }
30
+ function missingResolution(input, keys, path) {
31
+ if (keys.length === 1) throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
32
+ if (keys.length !== 2 || !keys.includes("reason")) failReference(path);
33
+ const reason = safeData(input, "reason", path);
34
+ if (reason === void 0 || reason === "missing") {
35
+ throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_MISSING", path);
36
+ }
37
+ if (reason === "denied") throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_DENIED", path);
38
+ return failReference(path);
39
+ }
40
+ function safeValue(input, path, limits) {
41
+ try {
42
+ if (values_js.isOption(input) || values_js.isResult(input) || temporal_js.isInstant(input) || temporal_js.isDuration(input)) {
43
+ values_js.validateKaladaValueLimits(input, {
44
+ maxDepth: limits.maxValueDepth,
45
+ maxNodes: limits.maxValueNodes,
46
+ maxStringLength: limits.maxStringLength
47
+ });
48
+ return input;
49
+ }
50
+ return json_js.cloneJson(input, {
51
+ maxDepth: limits.maxValueDepth,
52
+ maxNodes: limits.maxValueNodes,
53
+ maxStringLength: limits.maxStringLength
54
+ });
55
+ } catch (error) {
56
+ if (error instanceof RangeError) throw new diagnostics_js.KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
57
+ throw new diagnostics_js.KaladaFailure("KALADA_INVALID_RESULT", path);
58
+ }
59
+ }
60
+ function safeKeys(input, path) {
61
+ try {
62
+ return Reflect.ownKeys(input);
63
+ } catch {
64
+ return failReference(path);
65
+ }
66
+ }
67
+ function safeData(input, key, path) {
68
+ try {
69
+ return json_js.dataValue(input, key);
70
+ } catch {
71
+ return failReference(path);
72
+ }
73
+ }
74
+ function failReference(path) {
75
+ throw new diagnostics_js.KaladaFailure("KALADA_REFERENCE_ERROR", path);
76
+ }
77
+
78
+ exports.resolveReference = resolveReference;
79
+ //# sourceMappingURL=evaluation-resolution.cjs.map
80
+ //# sourceMappingURL=evaluation-resolution.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluation-resolution.ts"],"names":["KaladaFailure","rejectCallbackPromise","isOption","isResult","isInstant","isDuration","validateKaladaValueLimits","cloneJson","dataValue"],"mappings":"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","file":"evaluation-resolution.cjs","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { KaladaFailure } from \"./diagnostics.js\";\nimport type { Path } from \"./evaluation-frames.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { isDuration, isInstant } from \"./temporal.js\";\nimport type { KaladaV1Resolver } from \"./types.js\";\nimport { isOption, isResult, type KaladaValue, validateKaladaValueLimits } from \"./values.js\";\n\nexport function resolveReference<R extends JsonValue>(\n reference: R,\n path: Path,\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n): KaladaValue {\n let input: unknown;\n try {\n input = resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: ResolvedKaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\")) failReference(path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\")) failReference(path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\") {\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n }\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n return failReference(path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: ResolvedKaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n return failReference(path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n return failReference(path);\n }\n}\n\nfunction failReference(path: Path): never {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n"]}
@@ -0,0 +1,11 @@
1
+ import { Path } from './evaluation-frames.cjs';
2
+ import { JsonValue } from './json.cjs';
3
+ import { ResolvedKaladaV1Limits } from './limits.cjs';
4
+ import { KaladaV1Resolver } from './types.cjs';
5
+ import { KaladaValue } from './values.cjs';
6
+ import './runtime-values.cjs';
7
+ import './temporal.cjs';
8
+
9
+ declare function resolveReference<R extends JsonValue>(reference: R, path: Path, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits): KaladaValue;
10
+
11
+ export { resolveReference };
@@ -0,0 +1,11 @@
1
+ import { Path } from './evaluation-frames.js';
2
+ import { JsonValue } from './json.js';
3
+ import { ResolvedKaladaV1Limits } from './limits.js';
4
+ import { KaladaV1Resolver } from './types.js';
5
+ import { KaladaValue } from './values.js';
6
+ import './runtime-values.js';
7
+ import './temporal.js';
8
+
9
+ declare function resolveReference<R extends JsonValue>(reference: R, path: Path, resolve: KaladaV1Resolver<R>, limits: ResolvedKaladaV1Limits): KaladaValue;
10
+
11
+ export { resolveReference };
@@ -0,0 +1,78 @@
1
+ import { rejectCallbackPromise } from '../kuery-v1/callback-promise.js';
2
+ import { KaladaFailure } from './diagnostics.js';
3
+ import { cloneJson, dataValue } from './json.js';
4
+ import { isInstant, isDuration } from './temporal.js';
5
+ import { isOption, isResult, validateKaladaValueLimits } from './values.js';
6
+
7
+ function resolveReference(reference, path, resolve, limits) {
8
+ let input;
9
+ try {
10
+ input = resolve(reference);
11
+ } catch {
12
+ throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
13
+ }
14
+ if (rejectCallbackPromise(input)) throw new KaladaFailure("KALADA_ASYNC_UNSUPPORTED", path);
15
+ return parseResolution(input, path, limits);
16
+ }
17
+ function parseResolution(input, path, limits) {
18
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
19
+ throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
20
+ }
21
+ const keys = safeKeys(input, path);
22
+ const found = safeData(input, "found", path);
23
+ if (typeof found !== "boolean") throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
24
+ if (!found) return missingResolution(input, keys, path);
25
+ if (keys.length !== 2 || !keys.includes("value")) failReference(path);
26
+ return safeValue(safeData(input, "value", path), path, limits);
27
+ }
28
+ function missingResolution(input, keys, path) {
29
+ if (keys.length === 1) throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
30
+ if (keys.length !== 2 || !keys.includes("reason")) failReference(path);
31
+ const reason = safeData(input, "reason", path);
32
+ if (reason === void 0 || reason === "missing") {
33
+ throw new KaladaFailure("KALADA_REFERENCE_MISSING", path);
34
+ }
35
+ if (reason === "denied") throw new KaladaFailure("KALADA_REFERENCE_DENIED", path);
36
+ return failReference(path);
37
+ }
38
+ function safeValue(input, path, limits) {
39
+ try {
40
+ if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {
41
+ validateKaladaValueLimits(input, {
42
+ maxDepth: limits.maxValueDepth,
43
+ maxNodes: limits.maxValueNodes,
44
+ maxStringLength: limits.maxStringLength
45
+ });
46
+ return input;
47
+ }
48
+ return cloneJson(input, {
49
+ maxDepth: limits.maxValueDepth,
50
+ maxNodes: limits.maxValueNodes,
51
+ maxStringLength: limits.maxStringLength
52
+ });
53
+ } catch (error) {
54
+ if (error instanceof RangeError) throw new KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
55
+ throw new KaladaFailure("KALADA_INVALID_RESULT", path);
56
+ }
57
+ }
58
+ function safeKeys(input, path) {
59
+ try {
60
+ return Reflect.ownKeys(input);
61
+ } catch {
62
+ return failReference(path);
63
+ }
64
+ }
65
+ function safeData(input, key, path) {
66
+ try {
67
+ return dataValue(input, key);
68
+ } catch {
69
+ return failReference(path);
70
+ }
71
+ }
72
+ function failReference(path) {
73
+ throw new KaladaFailure("KALADA_REFERENCE_ERROR", path);
74
+ }
75
+
76
+ export { resolveReference };
77
+ //# sourceMappingURL=evaluation-resolution.js.map
78
+ //# sourceMappingURL=evaluation-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluation-resolution.ts"],"names":[],"mappings":"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","file":"evaluation-resolution.js","sourcesContent":["import { rejectCallbackPromise } from \"../kuery-v1/callback-promise.js\";\nimport { KaladaFailure } from \"./diagnostics.js\";\nimport type { Path } from \"./evaluation-frames.js\";\nimport { cloneJson, dataValue, type JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport { isDuration, isInstant } from \"./temporal.js\";\nimport type { KaladaV1Resolver } from \"./types.js\";\nimport { isOption, isResult, type KaladaValue, validateKaladaValueLimits } from \"./values.js\";\n\nexport function resolveReference<R extends JsonValue>(\n reference: R,\n path: Path,\n resolve: KaladaV1Resolver<R>,\n limits: ResolvedKaladaV1Limits,\n): KaladaValue {\n let input: unknown;\n try {\n input = resolve(reference);\n } catch {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n if (rejectCallbackPromise(input)) throw new KaladaFailure(\"KALADA_ASYNC_UNSUPPORTED\", path);\n return parseResolution(input, path, limits);\n}\n\nfunction parseResolution(input: unknown, path: Path, limits: ResolvedKaladaV1Limits): KaladaValue {\n if (typeof input !== \"object\" || input === null || Array.isArray(input)) {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n }\n const keys = safeKeys(input, path);\n const found = safeData(input, \"found\", path);\n if (typeof found !== \"boolean\") throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n if (!found) return missingResolution(input, keys, path);\n if (keys.length !== 2 || !keys.includes(\"value\")) failReference(path);\n return safeValue(safeData(input, \"value\", path), path, limits);\n}\n\nfunction missingResolution(input: object, keys: readonly PropertyKey[], path: Path): never {\n if (keys.length === 1) throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n if (keys.length !== 2 || !keys.includes(\"reason\")) failReference(path);\n const reason = safeData(input, \"reason\", path);\n if (reason === undefined || reason === \"missing\") {\n throw new KaladaFailure(\"KALADA_REFERENCE_MISSING\", path);\n }\n if (reason === \"denied\") throw new KaladaFailure(\"KALADA_REFERENCE_DENIED\", path);\n return failReference(path);\n}\n\nfunction safeValue(input: unknown, path: Path, limits: ResolvedKaladaV1Limits): KaladaValue {\n try {\n if (isOption(input) || isResult(input) || isInstant(input) || isDuration(input)) {\n validateKaladaValueLimits(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n return input;\n }\n return cloneJson(input, {\n maxDepth: limits.maxValueDepth,\n maxNodes: limits.maxValueNodes,\n maxStringLength: limits.maxStringLength,\n });\n } catch (error) {\n if (error instanceof RangeError) throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n throw new KaladaFailure(\"KALADA_INVALID_RESULT\", path);\n }\n}\n\nfunction safeKeys(input: object, path: Path): PropertyKey[] {\n try {\n return Reflect.ownKeys(input);\n } catch {\n return failReference(path);\n }\n}\n\nfunction safeData(input: object, key: string, path: Path): unknown {\n try {\n return dataValue(input, key);\n } catch {\n return failReference(path);\n }\n}\n\nfunction failReference(path: Path): never {\n throw new KaladaFailure(\"KALADA_REFERENCE_ERROR\", path);\n}\n"]}
@@ -0,0 +1,94 @@
1
+ 'use strict';
2
+
3
+ var diagnostics_js = require('./diagnostics.js');
4
+
5
+ function evaluate(node, path, environment, state) {
6
+ state.task = { node, path, environment };
7
+ }
8
+ function deliver(value, state) {
9
+ state.value = value;
10
+ }
11
+ function push(frame, failurePath, state) {
12
+ ensureCapacity(failurePath, state);
13
+ state.stack.push(frame);
14
+ }
15
+ function ensureCapacity(path, state) {
16
+ if (state.stack.length >= state.limits.maxContinuationFrames) {
17
+ fail("KALADA_CONTINUATION_LIMIT", path);
18
+ }
19
+ }
20
+ function charge(path, state) {
21
+ if (state.steps >= state.limits.maxEvaluationSteps) fail("KALADA_EVALUATION_LIMIT", path);
22
+ state.steps += 1;
23
+ }
24
+ function reserveCollectionIteration(path, state) {
25
+ if (state.collectionIterations >= state.limits.maxCollectionIterations) {
26
+ fail("KALADA_COLLECTION_LIMIT", path);
27
+ }
28
+ state.collectionIterations += 1;
29
+ charge(path, state);
30
+ }
31
+ function copyCaptures(path, state) {
32
+ const output = /* @__PURE__ */ new Map();
33
+ for (const name of state.captures.get(pathKey(path)) ?? []) {
34
+ if (state.captured >= state.limits.maxCapturedBindings) fail("KALADA_CAPTURE_LIMIT", path);
35
+ charge(path, state);
36
+ state.captured += 1;
37
+ output.set(name, state.environment.get(name));
38
+ }
39
+ return output;
40
+ }
41
+ function reserveClosure(path, state) {
42
+ if (state.closures >= state.limits.maxClosures) fail("KALADA_CLOSURE_LIMIT", path);
43
+ charge(path, state);
44
+ state.closures += 1;
45
+ }
46
+ function captureMap(functions) {
47
+ return new Map(functions.map((item) => [pathKey(item.path), item.captures]));
48
+ }
49
+ function unwind(state) {
50
+ while (state.stack.length > 0) {
51
+ const frame = state.stack.pop();
52
+ if (frame.kind === "binding" || frame.kind === "match") state.environment = frame.outer;
53
+ if (frame.kind === "function-group-body") state.environment = frame.outer;
54
+ if (frame.kind === "user-return") {
55
+ state.environment = frame.caller;
56
+ state.callDepth -= 1;
57
+ }
58
+ if (frame.kind === "core-iteration") state.callDepth -= 1;
59
+ }
60
+ }
61
+ function diagnosticContext(state) {
62
+ const context = [];
63
+ for (let index = state.stack.length - 1; index >= 0 && context.length < 32; index -= 1) {
64
+ const frame = state.stack[index];
65
+ if (frame.kind === "user-return") {
66
+ context.push({ kind: "function-call", name: frame.name, path: frame.path });
67
+ }
68
+ if (frame.kind === "core-iteration") {
69
+ context.push({ kind: "core-call", name: frame.operator, path: frame.path });
70
+ }
71
+ }
72
+ return context;
73
+ }
74
+ function fail(code, path) {
75
+ throw new diagnostics_js.KaladaFailure(code, path);
76
+ }
77
+ function pathKey(path) {
78
+ return JSON.stringify(path);
79
+ }
80
+
81
+ exports.captureMap = captureMap;
82
+ exports.charge = charge;
83
+ exports.copyCaptures = copyCaptures;
84
+ exports.deliver = deliver;
85
+ exports.diagnosticContext = diagnosticContext;
86
+ exports.ensureCapacity = ensureCapacity;
87
+ exports.evaluate = evaluate;
88
+ exports.fail = fail;
89
+ exports.push = push;
90
+ exports.reserveClosure = reserveClosure;
91
+ exports.reserveCollectionIteration = reserveCollectionIteration;
92
+ exports.unwind = unwind;
93
+ //# sourceMappingURL=evaluation-state.cjs.map
94
+ //# sourceMappingURL=evaluation-state.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/evaluation-state.ts"],"names":["KaladaFailure"],"mappings":";;;;AA6BO,SAAS,QAAA,CACd,IAAA,EACA,IAAA,EACA,WAAA,EACA,KAAA,EACM;AACN,EAAA,KAAA,CAAM,IAAA,GAAO,EAAE,IAAA,EAAM,IAAA,EAAM,WAAA,EAAY;AACzC;AAEO,SAAS,OAAA,CAA6B,OAAqB,KAAA,EAA8B;AAC9F,EAAA,KAAA,CAAM,KAAA,GAAQ,KAAA;AAChB;AAEO,SAAS,IAAA,CACd,KAAA,EACA,WAAA,EACA,KAAA,EACM;AACN,EAAA,cAAA,CAAe,aAAa,KAAK,CAAA;AACjC,EAAA,KAAA,CAAM,KAAA,CAAM,KAAK,KAAK,CAAA;AACxB;AAEO,SAAS,cAAA,CAAoC,MAAY,KAAA,EAA8B;AAC5F,EAAA,IAAI,KAAA,CAAM,KAAA,CAAM,MAAA,IAAU,KAAA,CAAM,OAAO,qBAAA,EAAuB;AAC5D,IAAA,IAAA,CAAK,6BAA6B,IAAI,CAAA;AAAA,EACxC;AACF;AAEO,SAAS,MAAA,CAA4B,MAAY,KAAA,EAA8B;AACpF,EAAA,IAAI,MAAM,KAAA,IAAS,KAAA,CAAM,OAAO,kBAAA,EAAoB,IAAA,CAAK,2BAA2B,IAAI,CAAA;AACxF,EAAA,KAAA,CAAM,KAAA,IAAS,CAAA;AACjB;AAEO,SAAS,0BAAA,CACd,MACA,KAAA,EACM;AACN,EAAA,IAAI,KAAA,CAAM,oBAAA,IAAwB,KAAA,CAAM,MAAA,CAAO,uBAAA,EAAyB;AACtE,IAAA,IAAA,CAAK,2BAA2B,IAAI,CAAA;AAAA,EACtC;AACA,EAAA,KAAA,CAAM,oBAAA,IAAwB,CAAA;AAC9B,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AACpB;AAEO,SAAS,YAAA,CACd,MACA,KAAA,EACoB;AACpB,EAAA,MAAM,MAAA,uBAAa,GAAA,EAA0B;AAC7C,EAAA,KAAA,MAAW,IAAA,IAAQ,MAAM,QAAA,CAAS,GAAA,CAAI,QAAQ,IAAI,CAAC,CAAA,IAAK,EAAC,EAAG;AAC1D,IAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,OAAO,mBAAA,EAAqB,IAAA,CAAK,wBAAwB,IAAI,CAAA;AACzF,IAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,IAAA,KAAA,CAAM,QAAA,IAAY,CAAA;AAClB,IAAA,MAAA,CAAO,IAAI,IAAA,EAAM,KAAA,CAAM,WAAA,CAAY,GAAA,CAAI,IAAI,CAAiB,CAAA;AAAA,EAC9D;AACA,EAAA,OAAO,MAAA;AACT;AAEO,SAAS,cAAA,CAAoC,MAAY,KAAA,EAA8B;AAC5F,EAAA,IAAI,MAAM,QAAA,IAAY,KAAA,CAAM,OAAO,WAAA,EAAa,IAAA,CAAK,wBAAwB,IAAI,CAAA;AACjF,EAAA,MAAA,CAAO,MAAM,KAAK,CAAA;AAClB,EAAA,KAAA,CAAM,QAAA,IAAY,CAAA;AACpB;AAEO,SAAS,WACd,SAAA,EACwC;AACxC,EAAA,OAAO,IAAI,GAAA,CAAI,SAAA,CAAU,GAAA,CAAI,CAAC,IAAA,KAAS,CAAC,OAAA,CAAQ,IAAA,CAAK,IAAI,CAAA,EAAG,IAAA,CAAK,QAAQ,CAAC,CAAC,CAAA;AAC7E;AAEO,SAAS,OAA4B,KAAA,EAA8B;AACxE,EAAA,OAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG;AAC7B,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,GAAA,EAAI;AAC9B,IAAA,IAAI,KAAA,CAAM,SAAS,SAAA,IAAa,KAAA,CAAM,SAAS,OAAA,EAAS,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA;AAClF,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,qBAAA,EAAuB,KAAA,CAAM,cAAc,KAAA,CAAM,KAAA;AACpE,IAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,MAAA,KAAA,CAAM,cAAc,KAAA,CAAM,MAAA;AAC1B,MAAA,KAAA,CAAM,SAAA,IAAa,CAAA;AAAA,IACrB;AACA,IAAA,IAAI,KAAA,CAAM,IAAA,KAAS,gBAAA,EAAkB,KAAA,CAAM,SAAA,IAAa,CAAA;AAAA,EAC1D;AACF;AAEO,SAAS,kBACd,KAAA,EAC2C;AAC3C,EAAA,MAAM,UAA4C,EAAC;AACnD,EAAA,KAAA,IAAS,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAA,EAAG,KAAA,IAAS,CAAA,IAAK,OAAA,CAAQ,MAAA,GAAS,EAAA,EAAI,KAAA,IAAS,CAAA,EAAG;AACtF,IAAA,MAAM,KAAA,GAAQ,KAAA,CAAM,KAAA,CAAM,KAAK,CAAA;AAC/B,IAAA,IAAI,KAAA,CAAM,SAAS,aAAA,EAAe;AAChC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,eAAA,EAAiB,IAAA,EAAM,MAAM,IAAA,EAAM,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,IAC5E;AACA,IAAA,IAAI,KAAA,CAAM,SAAS,gBAAA,EAAkB;AACnC,MAAA,OAAA,CAAQ,IAAA,CAAK,EAAE,IAAA,EAAM,WAAA,EAAa,IAAA,EAAM,MAAM,QAAA,EAAU,IAAA,EAAM,KAAA,CAAM,IAAA,EAAM,CAAA;AAAA,IAC5E;AAAA,EACF;AACA,EAAA,OAAO,OAAA;AACT;AAEO,SAAS,IAAA,CAAK,MAAsD,IAAA,EAAmB;AAC5F,EAAA,MAAM,IAAIA,4BAAA,CAAc,IAAA,EAAM,IAAI,CAAA;AACpC;AAEA,SAAS,QAAQ,IAAA,EAAoB;AACnC,EAAA,OAAO,IAAA,CAAK,UAAU,IAAI,CAAA;AAC5B","file":"evaluation-state.cjs","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { EvaluationFrame, EvaluationTask, Path } from \"./evaluation-frames.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { ResolvedKaladaV1Limits } from \"./limits.js\";\nimport type { RuntimeEnvironment, RuntimeValue } from \"./runtime-values.js\";\nimport type { InstantValue } from \"./temporal.js\";\nimport type {\n KaladaV1DiagnosticContextFrame,\n KaladaV1Expression,\n KaladaV1FunctionCapture,\n KaladaV1Resolver,\n} from \"./types.js\";\n\nexport interface MachineState<R extends JsonValue> {\n readonly resolve: KaladaV1Resolver<R>;\n readonly limits: ResolvedKaladaV1Limits;\n readonly captures: ReadonlyMap<string, readonly string[]>;\n readonly instant: InstantValue | undefined;\n readonly stack: EvaluationFrame<R>[];\n task: EvaluationTask<R> | null;\n value: RuntimeValue | null;\n environment: RuntimeEnvironment;\n steps: number;\n closures: number;\n captured: number;\n callDepth: number;\n collectionIterations: number;\n}\n\nexport function evaluate<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n environment: RuntimeEnvironment,\n state: MachineState<R>,\n): void {\n state.task = { node, path, environment };\n}\n\nexport function deliver<R extends JsonValue>(value: RuntimeValue, state: MachineState<R>): void {\n state.value = value;\n}\n\nexport function push<R extends JsonValue>(\n frame: EvaluationFrame<R>,\n failurePath: Path,\n state: MachineState<R>,\n): void {\n ensureCapacity(failurePath, state);\n state.stack.push(frame);\n}\n\nexport function ensureCapacity<R extends JsonValue>(path: Path, state: MachineState<R>): void {\n if (state.stack.length >= state.limits.maxContinuationFrames) {\n fail(\"KALADA_CONTINUATION_LIMIT\", path);\n }\n}\n\nexport function charge<R extends JsonValue>(path: Path, state: MachineState<R>): void {\n if (state.steps >= state.limits.maxEvaluationSteps) fail(\"KALADA_EVALUATION_LIMIT\", path);\n state.steps += 1;\n}\n\nexport function reserveCollectionIteration<R extends JsonValue>(\n path: Path,\n state: MachineState<R>,\n): void {\n if (state.collectionIterations >= state.limits.maxCollectionIterations) {\n fail(\"KALADA_COLLECTION_LIMIT\", path);\n }\n state.collectionIterations += 1;\n charge(path, state);\n}\n\nexport function copyCaptures<R extends JsonValue>(\n path: Path,\n state: MachineState<R>,\n): RuntimeEnvironment {\n const output = new Map<string, RuntimeValue>();\n for (const name of state.captures.get(pathKey(path)) ?? []) {\n if (state.captured >= state.limits.maxCapturedBindings) fail(\"KALADA_CAPTURE_LIMIT\", path);\n charge(path, state);\n state.captured += 1;\n output.set(name, state.environment.get(name) as RuntimeValue);\n }\n return output;\n}\n\nexport function reserveClosure<R extends JsonValue>(path: Path, state: MachineState<R>): void {\n if (state.closures >= state.limits.maxClosures) fail(\"KALADA_CLOSURE_LIMIT\", path);\n charge(path, state);\n state.closures += 1;\n}\n\nexport function captureMap(\n functions: readonly KaladaV1FunctionCapture[],\n): ReadonlyMap<string, readonly string[]> {\n return new Map(functions.map((item) => [pathKey(item.path), item.captures]));\n}\n\nexport function unwind<R extends JsonValue>(state: MachineState<R>): void {\n while (state.stack.length > 0) {\n const frame = state.stack.pop() as EvaluationFrame<R>;\n if (frame.kind === \"binding\" || frame.kind === \"match\") state.environment = frame.outer;\n if (frame.kind === \"function-group-body\") state.environment = frame.outer;\n if (frame.kind === \"user-return\") {\n state.environment = frame.caller;\n state.callDepth -= 1;\n }\n if (frame.kind === \"core-iteration\") state.callDepth -= 1;\n }\n}\n\nexport function diagnosticContext<R extends JsonValue>(\n state: MachineState<R>,\n): readonly KaladaV1DiagnosticContextFrame[] {\n const context: KaladaV1DiagnosticContextFrame[] = [];\n for (let index = state.stack.length - 1; index >= 0 && context.length < 32; index -= 1) {\n const frame = state.stack[index] as EvaluationFrame<R>;\n if (frame.kind === \"user-return\") {\n context.push({ kind: \"function-call\", name: frame.name, path: frame.path });\n }\n if (frame.kind === \"core-iteration\") {\n context.push({ kind: \"core-call\", name: frame.operator, path: frame.path });\n }\n }\n return context;\n}\n\nexport function fail(code: ConstructorParameters<typeof KaladaFailure>[0], path: Path): never {\n throw new KaladaFailure(code, path);\n}\n\nfunction pathKey(path: Path): string {\n return JSON.stringify(path);\n}\n"]}
@@ -0,0 +1,38 @@
1
+ import { KaladaFailure } from './diagnostics.cjs';
2
+ import { EvaluationFrame, EvaluationTask, Path } from './evaluation-frames.cjs';
3
+ import { JsonValue } from './json.cjs';
4
+ import { ResolvedKaladaV1Limits } from './limits.cjs';
5
+ import { RuntimeValue, RuntimeEnvironment } from './runtime-values.cjs';
6
+ import { InstantValue } from './temporal.cjs';
7
+ import { KaladaV1Resolver, KaladaV1FunctionCapture, KaladaV1DiagnosticContextFrame, KaladaV1Expression } from './types.cjs';
8
+ import './values.cjs';
9
+
10
+ interface MachineState<R extends JsonValue> {
11
+ readonly resolve: KaladaV1Resolver<R>;
12
+ readonly limits: ResolvedKaladaV1Limits;
13
+ readonly captures: ReadonlyMap<string, readonly string[]>;
14
+ readonly instant: InstantValue | undefined;
15
+ readonly stack: EvaluationFrame<R>[];
16
+ task: EvaluationTask<R> | null;
17
+ value: RuntimeValue | null;
18
+ environment: RuntimeEnvironment;
19
+ steps: number;
20
+ closures: number;
21
+ captured: number;
22
+ callDepth: number;
23
+ collectionIterations: number;
24
+ }
25
+ declare function evaluate<R extends JsonValue>(node: KaladaV1Expression<R>, path: Path, environment: RuntimeEnvironment, state: MachineState<R>): void;
26
+ declare function deliver<R extends JsonValue>(value: RuntimeValue, state: MachineState<R>): void;
27
+ declare function push<R extends JsonValue>(frame: EvaluationFrame<R>, failurePath: Path, state: MachineState<R>): void;
28
+ declare function ensureCapacity<R extends JsonValue>(path: Path, state: MachineState<R>): void;
29
+ declare function charge<R extends JsonValue>(path: Path, state: MachineState<R>): void;
30
+ declare function reserveCollectionIteration<R extends JsonValue>(path: Path, state: MachineState<R>): void;
31
+ declare function copyCaptures<R extends JsonValue>(path: Path, state: MachineState<R>): RuntimeEnvironment;
32
+ declare function reserveClosure<R extends JsonValue>(path: Path, state: MachineState<R>): void;
33
+ declare function captureMap(functions: readonly KaladaV1FunctionCapture[]): ReadonlyMap<string, readonly string[]>;
34
+ declare function unwind<R extends JsonValue>(state: MachineState<R>): void;
35
+ declare function diagnosticContext<R extends JsonValue>(state: MachineState<R>): readonly KaladaV1DiagnosticContextFrame[];
36
+ declare function fail(code: ConstructorParameters<typeof KaladaFailure>[0], path: Path): never;
37
+
38
+ export { type MachineState, captureMap, charge, copyCaptures, deliver, diagnosticContext, ensureCapacity, evaluate, fail, push, reserveClosure, reserveCollectionIteration, unwind };