@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,229 @@
1
+ 'use strict';
2
+
3
+ var diagnostics_js = require('./diagnostics.js');
4
+
5
+ const DYNAMIC = /* @__PURE__ */ Symbol("dynamic");
6
+ function checkKaladaV1Types(expression) {
7
+ infer(expression, ["expression"], /* @__PURE__ */ new Map());
8
+ }
9
+ function infer(node, path, scope) {
10
+ if (node.kind === "literal") return literalType(node.value);
11
+ if (node.kind === "ref")
12
+ return typeof node.ref === "string" ? scope.get(node.ref) ?? DYNAMIC : DYNAMIC;
13
+ if (node.kind === "function") return checkFunction(node, path, scope);
14
+ if (node.kind === "function-group") return checkGroup(node, path, scope);
15
+ if (node.kind === "call") return checkCall(node, path, scope);
16
+ if (node.kind === "core-function") return coreType(node.name);
17
+ if (node.kind === "binding") return checkBinding(node, path, scope);
18
+ if (node.kind === "option") return optionType(node, path, scope);
19
+ if (node.kind === "result") return resultType(node, path, scope);
20
+ if (node.kind === "match") return checkMatch(node, path, scope);
21
+ return inferTemporal(node, path, scope);
22
+ }
23
+ function checkFunction(node, path, outer) {
24
+ const parameters = /* @__PURE__ */ new Map();
25
+ for (const parameter of node.parameters) parameters.set(parameter.name, parameter.type);
26
+ const actual = infer(node.body, [...path, "body"], merged(outer, parameters));
27
+ requireAssignable(actual, node.returns, [...path, "body"]);
28
+ return functionType(
29
+ node.parameters.map((item) => item.type),
30
+ node.returns
31
+ );
32
+ }
33
+ function checkGroup(node, path, outer) {
34
+ const signatures = /* @__PURE__ */ new Map();
35
+ for (const fn of node.functions) signatures.set(fn.name, signature(fn));
36
+ const groupScope = merged(outer, signatures);
37
+ node.functions.forEach((fn, index) => {
38
+ checkMember(fn, [...path, "functions", index], groupScope);
39
+ });
40
+ return infer(node.body, [...path, "body"], groupScope);
41
+ }
42
+ function checkMember(fn, path, group) {
43
+ const parameters = /* @__PURE__ */ new Map();
44
+ for (const parameter of fn.parameters) parameters.set(parameter.name, parameter.type);
45
+ const actual = infer(fn.body, [...path, "body"], merged(group, parameters));
46
+ requireAssignable(actual, fn.returns, [...path, "body"]);
47
+ }
48
+ function checkCall(node, path, scope) {
49
+ const callee = infer(node.callee, [...path, "callee"], scope);
50
+ const args = node.arguments.map(
51
+ (item, index) => infer(item, [...path, "arguments", index], scope)
52
+ );
53
+ if (callee === DYNAMIC) return DYNAMIC;
54
+ if (!isFunctionType(callee)) fail("KALADA_NOT_CALLABLE", [...path, "callee"]);
55
+ if (args.length !== callee.parameters.length)
56
+ fail("KALADA_FUNCTION_ARITY", [...path, "arguments"]);
57
+ args.forEach((actual, index) => {
58
+ requireAssignable(actual, callee.parameters[index], [
59
+ ...path,
60
+ "arguments",
61
+ index
62
+ ]);
63
+ });
64
+ return callee.returns;
65
+ }
66
+ function checkBinding(node, path, scope) {
67
+ const value = infer(node.value, [...path, "value"], scope);
68
+ return infer(node.body, [...path, "body"], merged(scope, /* @__PURE__ */ new Map([[node.name, value]])));
69
+ }
70
+ function checkMatch(node, path, scope) {
71
+ const scrutinee = infer(node.value, [...path, "value"], scope);
72
+ const payloads = matchPayloads(node.type, scrutinee);
73
+ const branches = node.arms.map((arm, index) => {
74
+ const payload = payloads.get(arm.variant) ?? DYNAMIC;
75
+ const nested = arm.binding ? merged(scope, /* @__PURE__ */ new Map([[arm.binding, payload]])) : scope;
76
+ return infer(arm.body, [...path, "arms", index, "body"], nested);
77
+ });
78
+ return join(branches);
79
+ }
80
+ function matchPayloads(type, value) {
81
+ if (value === DYNAMIC) return /* @__PURE__ */ new Map();
82
+ if (type === "Option" && isOptionShape(value)) return /* @__PURE__ */ new Map([["some", value.value]]);
83
+ if (type === "Option" && !isShape(value) && value.kind === "option-type")
84
+ return /* @__PURE__ */ new Map([["some", value.value]]);
85
+ if (type === "Result" && isResultShape(value))
86
+ return /* @__PURE__ */ new Map([
87
+ ["ok", value.ok],
88
+ ["err", value.error]
89
+ ]);
90
+ if (type === "Result" && !isShape(value) && value.kind === "result-type")
91
+ return /* @__PURE__ */ new Map([
92
+ ["ok", value.ok],
93
+ ["err", value.error]
94
+ ]);
95
+ return /* @__PURE__ */ new Map();
96
+ }
97
+ function inferTemporal(node, path, scope) {
98
+ if (node.kind === "instant" || node.kind === "current-instant") return primitive("Instant");
99
+ if (node.kind === "duration") return primitive("Duration");
100
+ const left = infer(node.left, [...path, "left"], scope);
101
+ const right = infer(node.right, [...path, "right"], scope);
102
+ if (node.kind === "temporal-comparison") return primitive("boolean");
103
+ return temporalArithmetic(node.operator, left, right);
104
+ }
105
+ function temporalArithmetic(operator, left, right) {
106
+ if (operator === "add") return additionType(left);
107
+ if (isPrimitive(left, "Duration")) return primitive("Duration");
108
+ if (isPrimitive(right, "Instant")) return primitive("Duration");
109
+ if (isPrimitive(left, "Instant") && isPrimitive(right, "Duration")) return primitive("Instant");
110
+ return union([primitive("Instant"), primitive("Duration")]);
111
+ }
112
+ function additionType(left, _right) {
113
+ if (isPrimitive(left, "Instant")) return primitive("Instant");
114
+ if (isPrimitive(left, "Duration")) return primitive("Duration");
115
+ return union([primitive("Instant"), primitive("Duration")]);
116
+ }
117
+ function optionType(node, path, scope) {
118
+ return Object.freeze({
119
+ shape: "option",
120
+ value: node.variant === "none" ? DYNAMIC : infer(node.value, [...path, "value"], scope)
121
+ });
122
+ }
123
+ function resultType(node, path, scope) {
124
+ const value = infer(node.value, [...path, "value"], scope);
125
+ return Object.freeze({
126
+ shape: "result",
127
+ ok: node.variant === "ok" ? value : DYNAMIC,
128
+ error: node.variant === "err" ? value : DYNAMIC
129
+ });
130
+ }
131
+ function requireAssignable(actual, expected, path) {
132
+ if (!assignable(actual, expected)) fail("KALADA_FUNCTION_TYPE_MISMATCH", path);
133
+ }
134
+ function assignable(actual, expected) {
135
+ if (actual === DYNAMIC) return true;
136
+ if (isUnion(actual)) return actual.members.every((member) => assignable(member, expected));
137
+ if (isOptionShape(actual))
138
+ return expected.kind === "option-type" && assignable(actual.value, expected.value);
139
+ if (isResultShape(actual))
140
+ return expected.kind === "result-type" && assignable(actual.ok, expected.ok) && assignable(actual.error, expected.error);
141
+ if (expected.kind === "primitive-type" && expected.name === "json" && !isShape(actual)) {
142
+ return isJsonType(actual);
143
+ }
144
+ return equalType(actual, expected);
145
+ }
146
+ function isJsonType(type) {
147
+ if (type.kind === "array-type") return isJsonType(type.element);
148
+ if (type.kind !== "primitive-type") return false;
149
+ return ["null", "boolean", "number", "string", "json"].includes(type.name);
150
+ }
151
+ function join(types) {
152
+ const unique = [];
153
+ for (const item of types) {
154
+ if (!unique.some((candidate) => staticEqual(candidate, item))) unique.push(item);
155
+ }
156
+ return unique.length === 1 ? unique[0] : union(unique);
157
+ }
158
+ function staticEqual(left, right) {
159
+ if (left === DYNAMIC || right === DYNAMIC) return left === right;
160
+ return JSON.stringify(left) === JSON.stringify(right);
161
+ }
162
+ function union(members) {
163
+ return Object.freeze({ shape: "union", members: Object.freeze([...members]) });
164
+ }
165
+ function coreType(name) {
166
+ const callback = functionType(
167
+ [primitive("json"), primitive("number")],
168
+ primitive(name === "map" ? "json" : "boolean")
169
+ );
170
+ const array = Object.freeze({ kind: "array-type", element: primitive("json") });
171
+ return functionType(
172
+ [array, callback],
173
+ name === "some" || name === "every" ? primitive("boolean") : array
174
+ );
175
+ }
176
+ function signature(fn) {
177
+ return functionType(
178
+ fn.parameters.map((item) => item.type),
179
+ fn.returns
180
+ );
181
+ }
182
+ function functionType(parameters, returns) {
183
+ return Object.freeze({
184
+ kind: "function-type",
185
+ parameters: Object.freeze([...parameters]),
186
+ returns
187
+ });
188
+ }
189
+ function literalType(value) {
190
+ if (Array.isArray(value))
191
+ return Object.freeze({ kind: "array-type", element: primitive("json") });
192
+ return primitive(
193
+ value === null ? "null" : typeof value === "object" ? "json" : typeof value
194
+ );
195
+ }
196
+ function primitive(name) {
197
+ return Object.freeze({ kind: "primitive-type", name });
198
+ }
199
+ function isFunctionType(value) {
200
+ return value !== DYNAMIC && !isShape(value) && value.kind === "function-type";
201
+ }
202
+ function isPrimitive(value, name) {
203
+ return value !== DYNAMIC && !isShape(value) && value.kind === "primitive-type" && value.name === name;
204
+ }
205
+ function isShape(value) {
206
+ return value !== DYNAMIC && "shape" in value;
207
+ }
208
+ function isOptionShape(value) {
209
+ return isShape(value) && value.shape === "option";
210
+ }
211
+ function isResultShape(value) {
212
+ return isShape(value) && value.shape === "result";
213
+ }
214
+ function isUnion(value) {
215
+ return isShape(value) && value.shape === "union";
216
+ }
217
+ function equalType(left, right) {
218
+ return JSON.stringify(left) === JSON.stringify(right);
219
+ }
220
+ function merged(base, extra) {
221
+ return new Map([...base, ...extra]);
222
+ }
223
+ function fail(code, path) {
224
+ throw new diagnostics_js.KaladaFailure(code, path);
225
+ }
226
+
227
+ exports.checkKaladaV1Types = checkKaladaV1Types;
228
+ //# sourceMappingURL=static-types.cjs.map
229
+ //# sourceMappingURL=static-types.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/static-types.ts"],"names":["KaladaFailure"],"mappings":"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","file":"static-types.cjs","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { KaladaFunctionType, KaladaType, KaladaV1Expression, NamedFunction } from \"./types.js\";\n\ntype Path = readonly (string | number)[];\nconst DYNAMIC = Symbol(\"dynamic\");\ntype Dynamic = typeof DYNAMIC;\ninterface OptionShape {\n readonly shape: \"option\";\n readonly value: StaticType;\n}\ninterface ResultShape {\n readonly shape: \"result\";\n readonly ok: StaticType;\n readonly error: StaticType;\n}\ninterface UnionShape {\n readonly shape: \"union\";\n readonly members: readonly StaticType[];\n}\ntype StaticType = KaladaType | Dynamic | OptionShape | ResultShape | UnionShape;\ntype Scope = ReadonlyMap<string, StaticType>;\n\nexport function checkKaladaV1Types<R extends JsonValue>(expression: KaladaV1Expression<R>): void {\n infer(expression, [\"expression\"], new Map());\n}\n\nfunction infer<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Scope,\n): StaticType {\n if (node.kind === \"literal\") return literalType(node.value);\n if (node.kind === \"ref\")\n return typeof node.ref === \"string\" ? (scope.get(node.ref) ?? DYNAMIC) : DYNAMIC;\n if (node.kind === \"function\") return checkFunction(node, path, scope);\n if (node.kind === \"function-group\") return checkGroup(node, path, scope);\n if (node.kind === \"call\") return checkCall(node, path, scope);\n if (node.kind === \"core-function\") return coreType(node.name);\n if (node.kind === \"binding\") return checkBinding(node, path, scope);\n if (node.kind === \"option\") return optionType(node, path, scope);\n if (node.kind === \"result\") return resultType(node, path, scope);\n if (node.kind === \"match\") return checkMatch(node, path, scope);\n return inferTemporal(node, path, scope);\n}\n\nfunction checkFunction<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function\" }>,\n path: Path,\n outer: Scope,\n): KaladaFunctionType {\n const parameters = new Map<string, StaticType>();\n for (const parameter of node.parameters) parameters.set(parameter.name, parameter.type);\n const actual = infer(node.body, [...path, \"body\"], merged(outer, parameters));\n requireAssignable(actual, node.returns, [...path, \"body\"]);\n return functionType(\n node.parameters.map((item) => item.type),\n node.returns,\n );\n}\n\nfunction checkGroup<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n path: Path,\n outer: Scope,\n): StaticType {\n const signatures = new Map<string, StaticType>();\n for (const fn of node.functions) signatures.set(fn.name, signature(fn));\n const groupScope = merged(outer, signatures);\n node.functions.forEach((fn, index) => {\n checkMember(fn, [...path, \"functions\", index], groupScope);\n });\n return infer(node.body, [...path, \"body\"], groupScope);\n}\n\nfunction checkMember<R extends JsonValue>(fn: NamedFunction<R>, path: Path, group: Scope): void {\n const parameters = new Map<string, StaticType>();\n for (const parameter of fn.parameters) parameters.set(parameter.name, parameter.type);\n const actual = infer(fn.body, [...path, \"body\"], merged(group, parameters));\n requireAssignable(actual, fn.returns, [...path, \"body\"]);\n}\n\nfunction checkCall<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"call\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const callee = infer(node.callee, [...path, \"callee\"], scope);\n const args = node.arguments.map((item, index) =>\n infer(item, [...path, \"arguments\", index], scope),\n );\n if (callee === DYNAMIC) return DYNAMIC;\n if (!isFunctionType(callee)) fail(\"KALADA_NOT_CALLABLE\", [...path, \"callee\"]);\n if (args.length !== callee.parameters.length)\n fail(\"KALADA_FUNCTION_ARITY\", [...path, \"arguments\"]);\n args.forEach((actual, index) => {\n requireAssignable(actual, callee.parameters[index] as KaladaType, [\n ...path,\n \"arguments\",\n index,\n ]);\n });\n return callee.returns;\n}\n\nfunction checkBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const value = infer(node.value, [...path, \"value\"], scope);\n return infer(node.body, [...path, \"body\"], merged(scope, new Map([[node.name, value]])));\n}\n\nfunction checkMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const scrutinee = infer(node.value, [...path, \"value\"], scope);\n const payloads = matchPayloads(node.type, scrutinee);\n const branches = node.arms.map((arm, index) => {\n const payload = payloads.get(arm.variant) ?? DYNAMIC;\n const nested = arm.binding ? merged(scope, new Map([[arm.binding, payload]])) : scope;\n return infer(arm.body, [...path, \"arms\", index, \"body\"], nested);\n });\n return join(branches);\n}\n\nfunction matchPayloads(\n type: \"Option\" | \"Result\",\n value: StaticType,\n): ReadonlyMap<string, StaticType> {\n if (value === DYNAMIC) return new Map();\n if (type === \"Option\" && isOptionShape(value)) return new Map([[\"some\", value.value]]);\n if (type === \"Option\" && !isShape(value) && value.kind === \"option-type\")\n return new Map([[\"some\", value.value]]);\n if (type === \"Result\" && isResultShape(value))\n return new Map([\n [\"ok\", value.ok],\n [\"err\", value.error],\n ]);\n if (type === \"Result\" && !isShape(value) && value.kind === \"result-type\")\n return new Map([\n [\"ok\", value.ok],\n [\"err\", value.error],\n ]);\n return new Map();\n}\n\nfunction inferTemporal<R extends JsonValue>(\n node: Extract<\n KaladaV1Expression<R>,\n {\n kind:\n | \"instant\"\n | \"duration\"\n | \"current-instant\"\n | \"temporal-arithmetic\"\n | \"temporal-comparison\";\n }\n >,\n path: Path,\n scope: Scope,\n): StaticType {\n if (node.kind === \"instant\" || node.kind === \"current-instant\") return primitive(\"Instant\");\n if (node.kind === \"duration\") return primitive(\"Duration\");\n const left = infer(node.left, [...path, \"left\"], scope);\n const right = infer(node.right, [...path, \"right\"], scope);\n if (node.kind === \"temporal-comparison\") return primitive(\"boolean\");\n return temporalArithmetic(node.operator, left, right);\n}\n\nfunction temporalArithmetic(\n operator: \"add\" | \"subtract\",\n left: StaticType,\n right: StaticType,\n): StaticType {\n if (operator === \"add\") return additionType(left, right);\n if (isPrimitive(left, \"Duration\")) return primitive(\"Duration\");\n if (isPrimitive(right, \"Instant\")) return primitive(\"Duration\");\n if (isPrimitive(left, \"Instant\") && isPrimitive(right, \"Duration\")) return primitive(\"Instant\");\n return union([primitive(\"Instant\"), primitive(\"Duration\")]);\n}\n\nfunction additionType(left: StaticType, _right: StaticType): StaticType {\n if (isPrimitive(left, \"Instant\")) return primitive(\"Instant\");\n if (isPrimitive(left, \"Duration\")) return primitive(\"Duration\");\n return union([primitive(\"Instant\"), primitive(\"Duration\")]);\n}\n\nfunction optionType<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"option\" }>,\n path: Path,\n scope: Scope,\n): OptionShape {\n return Object.freeze({\n shape: \"option\",\n value: node.variant === \"none\" ? DYNAMIC : infer(node.value, [...path, \"value\"], scope),\n });\n}\n\nfunction resultType<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"result\" }>,\n path: Path,\n scope: Scope,\n): ResultShape {\n const value = infer(node.value, [...path, \"value\"], scope);\n return Object.freeze({\n shape: \"result\",\n ok: node.variant === \"ok\" ? value : DYNAMIC,\n error: node.variant === \"err\" ? value : DYNAMIC,\n });\n}\n\nfunction requireAssignable(actual: StaticType, expected: KaladaType, path: Path): void {\n if (!assignable(actual, expected)) fail(\"KALADA_FUNCTION_TYPE_MISMATCH\", path);\n}\n\nfunction assignable(actual: StaticType, expected: KaladaType): boolean {\n if (actual === DYNAMIC) return true;\n if (isUnion(actual)) return actual.members.every((member) => assignable(member, expected));\n if (isOptionShape(actual))\n return expected.kind === \"option-type\" && assignable(actual.value, expected.value);\n if (isResultShape(actual))\n return (\n expected.kind === \"result-type\" &&\n assignable(actual.ok, expected.ok) &&\n assignable(actual.error, expected.error)\n );\n if (expected.kind === \"primitive-type\" && expected.name === \"json\" && !isShape(actual)) {\n return isJsonType(actual);\n }\n return equalType(actual, expected);\n}\n\nfunction isJsonType(type: KaladaType): boolean {\n if (type.kind === \"array-type\") return isJsonType(type.element);\n if (type.kind !== \"primitive-type\") return false;\n return [\"null\", \"boolean\", \"number\", \"string\", \"json\"].includes(type.name);\n}\n\nfunction join(types: readonly StaticType[]): StaticType {\n const unique: StaticType[] = [];\n for (const item of types) {\n if (!unique.some((candidate) => staticEqual(candidate, item))) unique.push(item);\n }\n return unique.length === 1 ? (unique[0] as StaticType) : union(unique);\n}\n\nfunction staticEqual(left: StaticType, right: StaticType): boolean {\n if (left === DYNAMIC || right === DYNAMIC) return left === right;\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction union(members: readonly StaticType[]): UnionShape {\n return Object.freeze({ shape: \"union\", members: Object.freeze([...members]) });\n}\n\nfunction coreType(name: \"map\" | \"filter\" | \"some\" | \"every\"): KaladaFunctionType {\n const callback = functionType(\n [primitive(\"json\"), primitive(\"number\")],\n primitive(name === \"map\" ? \"json\" : \"boolean\"),\n );\n const array = Object.freeze({ kind: \"array-type\", element: primitive(\"json\") }) as KaladaType;\n return functionType(\n [array, callback],\n name === \"some\" || name === \"every\" ? primitive(\"boolean\") : array,\n );\n}\n\nfunction signature<R extends JsonValue>(fn: NamedFunction<R>): KaladaFunctionType {\n return functionType(\n fn.parameters.map((item) => item.type),\n fn.returns,\n );\n}\n\nfunction functionType(parameters: readonly KaladaType[], returns: KaladaType): KaladaFunctionType {\n return Object.freeze({\n kind: \"function-type\",\n parameters: Object.freeze([...parameters]),\n returns,\n });\n}\n\nfunction literalType(value: JsonValue): KaladaType {\n if (Array.isArray(value))\n return Object.freeze({ kind: \"array-type\", element: primitive(\"json\") });\n return primitive(\n value === null\n ? \"null\"\n : typeof value === \"object\"\n ? \"json\"\n : (typeof value as \"boolean\" | \"number\" | \"string\"),\n );\n}\n\nfunction primitive(\n name: \"null\" | \"boolean\" | \"number\" | \"string\" | \"json\" | \"Instant\" | \"Duration\",\n): KaladaType {\n return Object.freeze({ kind: \"primitive-type\", name });\n}\n\nfunction isFunctionType(value: StaticType): value is KaladaFunctionType {\n return value !== DYNAMIC && !isShape(value) && value.kind === \"function-type\";\n}\nfunction isPrimitive(value: StaticType, name: string): boolean {\n return (\n value !== DYNAMIC && !isShape(value) && value.kind === \"primitive-type\" && value.name === name\n );\n}\nfunction isShape(value: StaticType): value is OptionShape | ResultShape | UnionShape {\n return value !== DYNAMIC && \"shape\" in value;\n}\nfunction isOptionShape(value: StaticType): value is OptionShape {\n return isShape(value) && value.shape === \"option\";\n}\nfunction isResultShape(value: StaticType): value is ResultShape {\n return isShape(value) && value.shape === \"result\";\n}\nfunction isUnion(value: StaticType): value is UnionShape {\n return isShape(value) && value.shape === \"union\";\n}\nfunction equalType(left: KaladaType, right: KaladaType): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\nfunction merged(base: Scope, extra: Scope): Scope {\n return new Map([...base, ...extra]);\n}\nfunction fail(code: ConstructorParameters<typeof KaladaFailure>[0], path: Path): never {\n throw new KaladaFailure(code, path);\n}\n"]}
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.cjs';
2
+ import { KaladaV1Expression } from './types.cjs';
3
+ import './temporal.cjs';
4
+ import './values.cjs';
5
+
6
+ declare function checkKaladaV1Types<R extends JsonValue>(expression: KaladaV1Expression<R>): void;
7
+
8
+ export { checkKaladaV1Types };
@@ -0,0 +1,8 @@
1
+ import { JsonValue } from './json.js';
2
+ import { KaladaV1Expression } from './types.js';
3
+ import './temporal.js';
4
+ import './values.js';
5
+
6
+ declare function checkKaladaV1Types<R extends JsonValue>(expression: KaladaV1Expression<R>): void;
7
+
8
+ export { checkKaladaV1Types };
@@ -0,0 +1,227 @@
1
+ import { KaladaFailure } from './diagnostics.js';
2
+
3
+ const DYNAMIC = /* @__PURE__ */ Symbol("dynamic");
4
+ function checkKaladaV1Types(expression) {
5
+ infer(expression, ["expression"], /* @__PURE__ */ new Map());
6
+ }
7
+ function infer(node, path, scope) {
8
+ if (node.kind === "literal") return literalType(node.value);
9
+ if (node.kind === "ref")
10
+ return typeof node.ref === "string" ? scope.get(node.ref) ?? DYNAMIC : DYNAMIC;
11
+ if (node.kind === "function") return checkFunction(node, path, scope);
12
+ if (node.kind === "function-group") return checkGroup(node, path, scope);
13
+ if (node.kind === "call") return checkCall(node, path, scope);
14
+ if (node.kind === "core-function") return coreType(node.name);
15
+ if (node.kind === "binding") return checkBinding(node, path, scope);
16
+ if (node.kind === "option") return optionType(node, path, scope);
17
+ if (node.kind === "result") return resultType(node, path, scope);
18
+ if (node.kind === "match") return checkMatch(node, path, scope);
19
+ return inferTemporal(node, path, scope);
20
+ }
21
+ function checkFunction(node, path, outer) {
22
+ const parameters = /* @__PURE__ */ new Map();
23
+ for (const parameter of node.parameters) parameters.set(parameter.name, parameter.type);
24
+ const actual = infer(node.body, [...path, "body"], merged(outer, parameters));
25
+ requireAssignable(actual, node.returns, [...path, "body"]);
26
+ return functionType(
27
+ node.parameters.map((item) => item.type),
28
+ node.returns
29
+ );
30
+ }
31
+ function checkGroup(node, path, outer) {
32
+ const signatures = /* @__PURE__ */ new Map();
33
+ for (const fn of node.functions) signatures.set(fn.name, signature(fn));
34
+ const groupScope = merged(outer, signatures);
35
+ node.functions.forEach((fn, index) => {
36
+ checkMember(fn, [...path, "functions", index], groupScope);
37
+ });
38
+ return infer(node.body, [...path, "body"], groupScope);
39
+ }
40
+ function checkMember(fn, path, group) {
41
+ const parameters = /* @__PURE__ */ new Map();
42
+ for (const parameter of fn.parameters) parameters.set(parameter.name, parameter.type);
43
+ const actual = infer(fn.body, [...path, "body"], merged(group, parameters));
44
+ requireAssignable(actual, fn.returns, [...path, "body"]);
45
+ }
46
+ function checkCall(node, path, scope) {
47
+ const callee = infer(node.callee, [...path, "callee"], scope);
48
+ const args = node.arguments.map(
49
+ (item, index) => infer(item, [...path, "arguments", index], scope)
50
+ );
51
+ if (callee === DYNAMIC) return DYNAMIC;
52
+ if (!isFunctionType(callee)) fail("KALADA_NOT_CALLABLE", [...path, "callee"]);
53
+ if (args.length !== callee.parameters.length)
54
+ fail("KALADA_FUNCTION_ARITY", [...path, "arguments"]);
55
+ args.forEach((actual, index) => {
56
+ requireAssignable(actual, callee.parameters[index], [
57
+ ...path,
58
+ "arguments",
59
+ index
60
+ ]);
61
+ });
62
+ return callee.returns;
63
+ }
64
+ function checkBinding(node, path, scope) {
65
+ const value = infer(node.value, [...path, "value"], scope);
66
+ return infer(node.body, [...path, "body"], merged(scope, /* @__PURE__ */ new Map([[node.name, value]])));
67
+ }
68
+ function checkMatch(node, path, scope) {
69
+ const scrutinee = infer(node.value, [...path, "value"], scope);
70
+ const payloads = matchPayloads(node.type, scrutinee);
71
+ const branches = node.arms.map((arm, index) => {
72
+ const payload = payloads.get(arm.variant) ?? DYNAMIC;
73
+ const nested = arm.binding ? merged(scope, /* @__PURE__ */ new Map([[arm.binding, payload]])) : scope;
74
+ return infer(arm.body, [...path, "arms", index, "body"], nested);
75
+ });
76
+ return join(branches);
77
+ }
78
+ function matchPayloads(type, value) {
79
+ if (value === DYNAMIC) return /* @__PURE__ */ new Map();
80
+ if (type === "Option" && isOptionShape(value)) return /* @__PURE__ */ new Map([["some", value.value]]);
81
+ if (type === "Option" && !isShape(value) && value.kind === "option-type")
82
+ return /* @__PURE__ */ new Map([["some", value.value]]);
83
+ if (type === "Result" && isResultShape(value))
84
+ return /* @__PURE__ */ new Map([
85
+ ["ok", value.ok],
86
+ ["err", value.error]
87
+ ]);
88
+ if (type === "Result" && !isShape(value) && value.kind === "result-type")
89
+ return /* @__PURE__ */ new Map([
90
+ ["ok", value.ok],
91
+ ["err", value.error]
92
+ ]);
93
+ return /* @__PURE__ */ new Map();
94
+ }
95
+ function inferTemporal(node, path, scope) {
96
+ if (node.kind === "instant" || node.kind === "current-instant") return primitive("Instant");
97
+ if (node.kind === "duration") return primitive("Duration");
98
+ const left = infer(node.left, [...path, "left"], scope);
99
+ const right = infer(node.right, [...path, "right"], scope);
100
+ if (node.kind === "temporal-comparison") return primitive("boolean");
101
+ return temporalArithmetic(node.operator, left, right);
102
+ }
103
+ function temporalArithmetic(operator, left, right) {
104
+ if (operator === "add") return additionType(left);
105
+ if (isPrimitive(left, "Duration")) return primitive("Duration");
106
+ if (isPrimitive(right, "Instant")) return primitive("Duration");
107
+ if (isPrimitive(left, "Instant") && isPrimitive(right, "Duration")) return primitive("Instant");
108
+ return union([primitive("Instant"), primitive("Duration")]);
109
+ }
110
+ function additionType(left, _right) {
111
+ if (isPrimitive(left, "Instant")) return primitive("Instant");
112
+ if (isPrimitive(left, "Duration")) return primitive("Duration");
113
+ return union([primitive("Instant"), primitive("Duration")]);
114
+ }
115
+ function optionType(node, path, scope) {
116
+ return Object.freeze({
117
+ shape: "option",
118
+ value: node.variant === "none" ? DYNAMIC : infer(node.value, [...path, "value"], scope)
119
+ });
120
+ }
121
+ function resultType(node, path, scope) {
122
+ const value = infer(node.value, [...path, "value"], scope);
123
+ return Object.freeze({
124
+ shape: "result",
125
+ ok: node.variant === "ok" ? value : DYNAMIC,
126
+ error: node.variant === "err" ? value : DYNAMIC
127
+ });
128
+ }
129
+ function requireAssignable(actual, expected, path) {
130
+ if (!assignable(actual, expected)) fail("KALADA_FUNCTION_TYPE_MISMATCH", path);
131
+ }
132
+ function assignable(actual, expected) {
133
+ if (actual === DYNAMIC) return true;
134
+ if (isUnion(actual)) return actual.members.every((member) => assignable(member, expected));
135
+ if (isOptionShape(actual))
136
+ return expected.kind === "option-type" && assignable(actual.value, expected.value);
137
+ if (isResultShape(actual))
138
+ return expected.kind === "result-type" && assignable(actual.ok, expected.ok) && assignable(actual.error, expected.error);
139
+ if (expected.kind === "primitive-type" && expected.name === "json" && !isShape(actual)) {
140
+ return isJsonType(actual);
141
+ }
142
+ return equalType(actual, expected);
143
+ }
144
+ function isJsonType(type) {
145
+ if (type.kind === "array-type") return isJsonType(type.element);
146
+ if (type.kind !== "primitive-type") return false;
147
+ return ["null", "boolean", "number", "string", "json"].includes(type.name);
148
+ }
149
+ function join(types) {
150
+ const unique = [];
151
+ for (const item of types) {
152
+ if (!unique.some((candidate) => staticEqual(candidate, item))) unique.push(item);
153
+ }
154
+ return unique.length === 1 ? unique[0] : union(unique);
155
+ }
156
+ function staticEqual(left, right) {
157
+ if (left === DYNAMIC || right === DYNAMIC) return left === right;
158
+ return JSON.stringify(left) === JSON.stringify(right);
159
+ }
160
+ function union(members) {
161
+ return Object.freeze({ shape: "union", members: Object.freeze([...members]) });
162
+ }
163
+ function coreType(name) {
164
+ const callback = functionType(
165
+ [primitive("json"), primitive("number")],
166
+ primitive(name === "map" ? "json" : "boolean")
167
+ );
168
+ const array = Object.freeze({ kind: "array-type", element: primitive("json") });
169
+ return functionType(
170
+ [array, callback],
171
+ name === "some" || name === "every" ? primitive("boolean") : array
172
+ );
173
+ }
174
+ function signature(fn) {
175
+ return functionType(
176
+ fn.parameters.map((item) => item.type),
177
+ fn.returns
178
+ );
179
+ }
180
+ function functionType(parameters, returns) {
181
+ return Object.freeze({
182
+ kind: "function-type",
183
+ parameters: Object.freeze([...parameters]),
184
+ returns
185
+ });
186
+ }
187
+ function literalType(value) {
188
+ if (Array.isArray(value))
189
+ return Object.freeze({ kind: "array-type", element: primitive("json") });
190
+ return primitive(
191
+ value === null ? "null" : typeof value === "object" ? "json" : typeof value
192
+ );
193
+ }
194
+ function primitive(name) {
195
+ return Object.freeze({ kind: "primitive-type", name });
196
+ }
197
+ function isFunctionType(value) {
198
+ return value !== DYNAMIC && !isShape(value) && value.kind === "function-type";
199
+ }
200
+ function isPrimitive(value, name) {
201
+ return value !== DYNAMIC && !isShape(value) && value.kind === "primitive-type" && value.name === name;
202
+ }
203
+ function isShape(value) {
204
+ return value !== DYNAMIC && "shape" in value;
205
+ }
206
+ function isOptionShape(value) {
207
+ return isShape(value) && value.shape === "option";
208
+ }
209
+ function isResultShape(value) {
210
+ return isShape(value) && value.shape === "result";
211
+ }
212
+ function isUnion(value) {
213
+ return isShape(value) && value.shape === "union";
214
+ }
215
+ function equalType(left, right) {
216
+ return JSON.stringify(left) === JSON.stringify(right);
217
+ }
218
+ function merged(base, extra) {
219
+ return new Map([...base, ...extra]);
220
+ }
221
+ function fail(code, path) {
222
+ throw new KaladaFailure(code, path);
223
+ }
224
+
225
+ export { checkKaladaV1Types };
226
+ //# sourceMappingURL=static-types.js.map
227
+ //# sourceMappingURL=static-types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/kalada-v1/static-types.ts"],"names":[],"mappings":"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","file":"static-types.js","sourcesContent":["import { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type { KaladaFunctionType, KaladaType, KaladaV1Expression, NamedFunction } from \"./types.js\";\n\ntype Path = readonly (string | number)[];\nconst DYNAMIC = Symbol(\"dynamic\");\ntype Dynamic = typeof DYNAMIC;\ninterface OptionShape {\n readonly shape: \"option\";\n readonly value: StaticType;\n}\ninterface ResultShape {\n readonly shape: \"result\";\n readonly ok: StaticType;\n readonly error: StaticType;\n}\ninterface UnionShape {\n readonly shape: \"union\";\n readonly members: readonly StaticType[];\n}\ntype StaticType = KaladaType | Dynamic | OptionShape | ResultShape | UnionShape;\ntype Scope = ReadonlyMap<string, StaticType>;\n\nexport function checkKaladaV1Types<R extends JsonValue>(expression: KaladaV1Expression<R>): void {\n infer(expression, [\"expression\"], new Map());\n}\n\nfunction infer<R extends JsonValue>(\n node: KaladaV1Expression<R>,\n path: Path,\n scope: Scope,\n): StaticType {\n if (node.kind === \"literal\") return literalType(node.value);\n if (node.kind === \"ref\")\n return typeof node.ref === \"string\" ? (scope.get(node.ref) ?? DYNAMIC) : DYNAMIC;\n if (node.kind === \"function\") return checkFunction(node, path, scope);\n if (node.kind === \"function-group\") return checkGroup(node, path, scope);\n if (node.kind === \"call\") return checkCall(node, path, scope);\n if (node.kind === \"core-function\") return coreType(node.name);\n if (node.kind === \"binding\") return checkBinding(node, path, scope);\n if (node.kind === \"option\") return optionType(node, path, scope);\n if (node.kind === \"result\") return resultType(node, path, scope);\n if (node.kind === \"match\") return checkMatch(node, path, scope);\n return inferTemporal(node, path, scope);\n}\n\nfunction checkFunction<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function\" }>,\n path: Path,\n outer: Scope,\n): KaladaFunctionType {\n const parameters = new Map<string, StaticType>();\n for (const parameter of node.parameters) parameters.set(parameter.name, parameter.type);\n const actual = infer(node.body, [...path, \"body\"], merged(outer, parameters));\n requireAssignable(actual, node.returns, [...path, \"body\"]);\n return functionType(\n node.parameters.map((item) => item.type),\n node.returns,\n );\n}\n\nfunction checkGroup<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"function-group\" }>,\n path: Path,\n outer: Scope,\n): StaticType {\n const signatures = new Map<string, StaticType>();\n for (const fn of node.functions) signatures.set(fn.name, signature(fn));\n const groupScope = merged(outer, signatures);\n node.functions.forEach((fn, index) => {\n checkMember(fn, [...path, \"functions\", index], groupScope);\n });\n return infer(node.body, [...path, \"body\"], groupScope);\n}\n\nfunction checkMember<R extends JsonValue>(fn: NamedFunction<R>, path: Path, group: Scope): void {\n const parameters = new Map<string, StaticType>();\n for (const parameter of fn.parameters) parameters.set(parameter.name, parameter.type);\n const actual = infer(fn.body, [...path, \"body\"], merged(group, parameters));\n requireAssignable(actual, fn.returns, [...path, \"body\"]);\n}\n\nfunction checkCall<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"call\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const callee = infer(node.callee, [...path, \"callee\"], scope);\n const args = node.arguments.map((item, index) =>\n infer(item, [...path, \"arguments\", index], scope),\n );\n if (callee === DYNAMIC) return DYNAMIC;\n if (!isFunctionType(callee)) fail(\"KALADA_NOT_CALLABLE\", [...path, \"callee\"]);\n if (args.length !== callee.parameters.length)\n fail(\"KALADA_FUNCTION_ARITY\", [...path, \"arguments\"]);\n args.forEach((actual, index) => {\n requireAssignable(actual, callee.parameters[index] as KaladaType, [\n ...path,\n \"arguments\",\n index,\n ]);\n });\n return callee.returns;\n}\n\nfunction checkBinding<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"binding\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const value = infer(node.value, [...path, \"value\"], scope);\n return infer(node.body, [...path, \"body\"], merged(scope, new Map([[node.name, value]])));\n}\n\nfunction checkMatch<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"match\" }>,\n path: Path,\n scope: Scope,\n): StaticType {\n const scrutinee = infer(node.value, [...path, \"value\"], scope);\n const payloads = matchPayloads(node.type, scrutinee);\n const branches = node.arms.map((arm, index) => {\n const payload = payloads.get(arm.variant) ?? DYNAMIC;\n const nested = arm.binding ? merged(scope, new Map([[arm.binding, payload]])) : scope;\n return infer(arm.body, [...path, \"arms\", index, \"body\"], nested);\n });\n return join(branches);\n}\n\nfunction matchPayloads(\n type: \"Option\" | \"Result\",\n value: StaticType,\n): ReadonlyMap<string, StaticType> {\n if (value === DYNAMIC) return new Map();\n if (type === \"Option\" && isOptionShape(value)) return new Map([[\"some\", value.value]]);\n if (type === \"Option\" && !isShape(value) && value.kind === \"option-type\")\n return new Map([[\"some\", value.value]]);\n if (type === \"Result\" && isResultShape(value))\n return new Map([\n [\"ok\", value.ok],\n [\"err\", value.error],\n ]);\n if (type === \"Result\" && !isShape(value) && value.kind === \"result-type\")\n return new Map([\n [\"ok\", value.ok],\n [\"err\", value.error],\n ]);\n return new Map();\n}\n\nfunction inferTemporal<R extends JsonValue>(\n node: Extract<\n KaladaV1Expression<R>,\n {\n kind:\n | \"instant\"\n | \"duration\"\n | \"current-instant\"\n | \"temporal-arithmetic\"\n | \"temporal-comparison\";\n }\n >,\n path: Path,\n scope: Scope,\n): StaticType {\n if (node.kind === \"instant\" || node.kind === \"current-instant\") return primitive(\"Instant\");\n if (node.kind === \"duration\") return primitive(\"Duration\");\n const left = infer(node.left, [...path, \"left\"], scope);\n const right = infer(node.right, [...path, \"right\"], scope);\n if (node.kind === \"temporal-comparison\") return primitive(\"boolean\");\n return temporalArithmetic(node.operator, left, right);\n}\n\nfunction temporalArithmetic(\n operator: \"add\" | \"subtract\",\n left: StaticType,\n right: StaticType,\n): StaticType {\n if (operator === \"add\") return additionType(left, right);\n if (isPrimitive(left, \"Duration\")) return primitive(\"Duration\");\n if (isPrimitive(right, \"Instant\")) return primitive(\"Duration\");\n if (isPrimitive(left, \"Instant\") && isPrimitive(right, \"Duration\")) return primitive(\"Instant\");\n return union([primitive(\"Instant\"), primitive(\"Duration\")]);\n}\n\nfunction additionType(left: StaticType, _right: StaticType): StaticType {\n if (isPrimitive(left, \"Instant\")) return primitive(\"Instant\");\n if (isPrimitive(left, \"Duration\")) return primitive(\"Duration\");\n return union([primitive(\"Instant\"), primitive(\"Duration\")]);\n}\n\nfunction optionType<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"option\" }>,\n path: Path,\n scope: Scope,\n): OptionShape {\n return Object.freeze({\n shape: \"option\",\n value: node.variant === \"none\" ? DYNAMIC : infer(node.value, [...path, \"value\"], scope),\n });\n}\n\nfunction resultType<R extends JsonValue>(\n node: Extract<KaladaV1Expression<R>, { kind: \"result\" }>,\n path: Path,\n scope: Scope,\n): ResultShape {\n const value = infer(node.value, [...path, \"value\"], scope);\n return Object.freeze({\n shape: \"result\",\n ok: node.variant === \"ok\" ? value : DYNAMIC,\n error: node.variant === \"err\" ? value : DYNAMIC,\n });\n}\n\nfunction requireAssignable(actual: StaticType, expected: KaladaType, path: Path): void {\n if (!assignable(actual, expected)) fail(\"KALADA_FUNCTION_TYPE_MISMATCH\", path);\n}\n\nfunction assignable(actual: StaticType, expected: KaladaType): boolean {\n if (actual === DYNAMIC) return true;\n if (isUnion(actual)) return actual.members.every((member) => assignable(member, expected));\n if (isOptionShape(actual))\n return expected.kind === \"option-type\" && assignable(actual.value, expected.value);\n if (isResultShape(actual))\n return (\n expected.kind === \"result-type\" &&\n assignable(actual.ok, expected.ok) &&\n assignable(actual.error, expected.error)\n );\n if (expected.kind === \"primitive-type\" && expected.name === \"json\" && !isShape(actual)) {\n return isJsonType(actual);\n }\n return equalType(actual, expected);\n}\n\nfunction isJsonType(type: KaladaType): boolean {\n if (type.kind === \"array-type\") return isJsonType(type.element);\n if (type.kind !== \"primitive-type\") return false;\n return [\"null\", \"boolean\", \"number\", \"string\", \"json\"].includes(type.name);\n}\n\nfunction join(types: readonly StaticType[]): StaticType {\n const unique: StaticType[] = [];\n for (const item of types) {\n if (!unique.some((candidate) => staticEqual(candidate, item))) unique.push(item);\n }\n return unique.length === 1 ? (unique[0] as StaticType) : union(unique);\n}\n\nfunction staticEqual(left: StaticType, right: StaticType): boolean {\n if (left === DYNAMIC || right === DYNAMIC) return left === right;\n return JSON.stringify(left) === JSON.stringify(right);\n}\n\nfunction union(members: readonly StaticType[]): UnionShape {\n return Object.freeze({ shape: \"union\", members: Object.freeze([...members]) });\n}\n\nfunction coreType(name: \"map\" | \"filter\" | \"some\" | \"every\"): KaladaFunctionType {\n const callback = functionType(\n [primitive(\"json\"), primitive(\"number\")],\n primitive(name === \"map\" ? \"json\" : \"boolean\"),\n );\n const array = Object.freeze({ kind: \"array-type\", element: primitive(\"json\") }) as KaladaType;\n return functionType(\n [array, callback],\n name === \"some\" || name === \"every\" ? primitive(\"boolean\") : array,\n );\n}\n\nfunction signature<R extends JsonValue>(fn: NamedFunction<R>): KaladaFunctionType {\n return functionType(\n fn.parameters.map((item) => item.type),\n fn.returns,\n );\n}\n\nfunction functionType(parameters: readonly KaladaType[], returns: KaladaType): KaladaFunctionType {\n return Object.freeze({\n kind: \"function-type\",\n parameters: Object.freeze([...parameters]),\n returns,\n });\n}\n\nfunction literalType(value: JsonValue): KaladaType {\n if (Array.isArray(value))\n return Object.freeze({ kind: \"array-type\", element: primitive(\"json\") });\n return primitive(\n value === null\n ? \"null\"\n : typeof value === \"object\"\n ? \"json\"\n : (typeof value as \"boolean\" | \"number\" | \"string\"),\n );\n}\n\nfunction primitive(\n name: \"null\" | \"boolean\" | \"number\" | \"string\" | \"json\" | \"Instant\" | \"Duration\",\n): KaladaType {\n return Object.freeze({ kind: \"primitive-type\", name });\n}\n\nfunction isFunctionType(value: StaticType): value is KaladaFunctionType {\n return value !== DYNAMIC && !isShape(value) && value.kind === \"function-type\";\n}\nfunction isPrimitive(value: StaticType, name: string): boolean {\n return (\n value !== DYNAMIC && !isShape(value) && value.kind === \"primitive-type\" && value.name === name\n );\n}\nfunction isShape(value: StaticType): value is OptionShape | ResultShape | UnionShape {\n return value !== DYNAMIC && \"shape\" in value;\n}\nfunction isOptionShape(value: StaticType): value is OptionShape {\n return isShape(value) && value.shape === \"option\";\n}\nfunction isResultShape(value: StaticType): value is ResultShape {\n return isShape(value) && value.shape === \"result\";\n}\nfunction isUnion(value: StaticType): value is UnionShape {\n return isShape(value) && value.shape === \"union\";\n}\nfunction equalType(left: KaladaType, right: KaladaType): boolean {\n return JSON.stringify(left) === JSON.stringify(right);\n}\nfunction merged(base: Scope, extra: Scope): Scope {\n return new Map([...base, ...extra]);\n}\nfunction fail(code: ConstructorParameters<typeof KaladaFailure>[0], path: Path): never {\n throw new KaladaFailure(code, path);\n}\n"]}