@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.
- package/README.md +62 -3
- package/dist/kalada-v1/canonical-input.cjs +133 -0
- package/dist/kalada-v1/canonical-input.cjs.map +1 -0
- package/dist/kalada-v1/canonical-input.d.cts +26 -0
- package/dist/kalada-v1/canonical-input.d.ts +26 -0
- package/dist/kalada-v1/canonical-input.js +122 -0
- package/dist/kalada-v1/canonical-input.js.map +1 -0
- package/dist/kalada-v1/canonicalize.cjs +93 -130
- package/dist/kalada-v1/canonicalize.cjs.map +1 -1
- package/dist/kalada-v1/canonicalize.d.cts +1 -0
- package/dist/kalada-v1/canonicalize.d.ts +1 -0
- package/dist/kalada-v1/canonicalize.js +71 -108
- package/dist/kalada-v1/canonicalize.js.map +1 -1
- package/dist/kalada-v1/codec.cjs +24 -0
- package/dist/kalada-v1/codec.cjs.map +1 -1
- package/dist/kalada-v1/codec.d.cts +5 -0
- package/dist/kalada-v1/codec.d.ts +5 -0
- package/dist/kalada-v1/codec.js +24 -0
- package/dist/kalada-v1/codec.js.map +1 -1
- package/dist/kalada-v1/compile.cjs +24 -1
- package/dist/kalada-v1/compile.cjs.map +1 -1
- package/dist/kalada-v1/compile.d.cts +1 -0
- package/dist/kalada-v1/compile.d.ts +1 -0
- package/dist/kalada-v1/compile.js +25 -2
- package/dist/kalada-v1/compile.js.map +1 -1
- package/dist/kalada-v1/dependencies.cjs +55 -2
- package/dist/kalada-v1/dependencies.cjs.map +1 -1
- package/dist/kalada-v1/dependencies.d.cts +1 -0
- package/dist/kalada-v1/dependencies.d.ts +1 -0
- package/dist/kalada-v1/dependencies.js +55 -2
- package/dist/kalada-v1/dependencies.js.map +1 -1
- package/dist/kalada-v1/diagnostics.cjs +29 -4
- package/dist/kalada-v1/diagnostics.cjs.map +1 -1
- package/dist/kalada-v1/diagnostics.d.cts +5 -3
- package/dist/kalada-v1/diagnostics.d.ts +5 -3
- package/dist/kalada-v1/diagnostics.js +29 -4
- package/dist/kalada-v1/diagnostics.js.map +1 -1
- package/dist/kalada-v1/evaluate.cjs +23 -117
- package/dist/kalada-v1/evaluate.cjs.map +1 -1
- package/dist/kalada-v1/evaluate.d.cts +4 -2
- package/dist/kalada-v1/evaluate.d.ts +4 -2
- package/dist/kalada-v1/evaluate.js +24 -118
- package/dist/kalada-v1/evaluate.js.map +1 -1
- package/dist/kalada-v1/evaluation-delivery.cjs +286 -0
- package/dist/kalada-v1/evaluation-delivery.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-delivery.d.cts +13 -0
- package/dist/kalada-v1/evaluation-delivery.d.ts +13 -0
- package/dist/kalada-v1/evaluation-delivery.js +284 -0
- package/dist/kalada-v1/evaluation-delivery.js.map +1 -0
- package/dist/kalada-v1/evaluation-frames.cjs +16 -0
- package/dist/kalada-v1/evaluation-frames.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-frames.d.cts +83 -0
- package/dist/kalada-v1/evaluation-frames.d.ts +83 -0
- package/dist/kalada-v1/evaluation-frames.js +14 -0
- package/dist/kalada-v1/evaluation-frames.js.map +1 -0
- package/dist/kalada-v1/evaluation-machine.cjs +226 -0
- package/dist/kalada-v1/evaluation-machine.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-machine.d.cts +9 -0
- package/dist/kalada-v1/evaluation-machine.d.ts +9 -0
- package/dist/kalada-v1/evaluation-machine.js +224 -0
- package/dist/kalada-v1/evaluation-machine.js.map +1 -0
- package/dist/kalada-v1/evaluation-resolution.cjs +80 -0
- package/dist/kalada-v1/evaluation-resolution.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-resolution.d.cts +11 -0
- package/dist/kalada-v1/evaluation-resolution.d.ts +11 -0
- package/dist/kalada-v1/evaluation-resolution.js +78 -0
- package/dist/kalada-v1/evaluation-resolution.js.map +1 -0
- package/dist/kalada-v1/evaluation-state.cjs +94 -0
- package/dist/kalada-v1/evaluation-state.cjs.map +1 -0
- package/dist/kalada-v1/evaluation-state.d.cts +38 -0
- package/dist/kalada-v1/evaluation-state.d.ts +38 -0
- package/dist/kalada-v1/evaluation-state.js +81 -0
- package/dist/kalada-v1/evaluation-state.js.map +1 -0
- package/dist/kalada-v1/factories.cjs +46 -0
- package/dist/kalada-v1/factories.cjs.map +1 -1
- package/dist/kalada-v1/factories.d.cts +24 -1
- package/dist/kalada-v1/factories.d.ts +24 -1
- package/dist/kalada-v1/factories.js +46 -0
- package/dist/kalada-v1/factories.js.map +1 -1
- package/dist/kalada-v1/function-contracts.cjs +150 -0
- package/dist/kalada-v1/function-contracts.cjs.map +1 -0
- package/dist/kalada-v1/function-contracts.d.cts +15 -0
- package/dist/kalada-v1/function-contracts.d.ts +15 -0
- package/dist/kalada-v1/function-contracts.js +144 -0
- package/dist/kalada-v1/function-contracts.js.map +1 -0
- package/dist/kalada-v1/index.cjs +30 -0
- package/dist/kalada-v1/index.d.cts +5 -3
- package/dist/kalada-v1/index.d.ts +5 -3
- package/dist/kalada-v1/index.js +4 -2
- package/dist/kalada-v1/limits.cjs +23 -2
- package/dist/kalada-v1/limits.cjs.map +1 -1
- package/dist/kalada-v1/limits.d.cts +6 -3
- package/dist/kalada-v1/limits.d.ts +6 -3
- package/dist/kalada-v1/limits.js +23 -3
- package/dist/kalada-v1/limits.js.map +1 -1
- package/dist/kalada-v1/runtime-values.cjs +112 -0
- package/dist/kalada-v1/runtime-values.cjs.map +1 -0
- package/dist/kalada-v1/runtime-values.d.cts +35 -0
- package/dist/kalada-v1/runtime-values.d.ts +35 -0
- package/dist/kalada-v1/runtime-values.js +105 -0
- package/dist/kalada-v1/runtime-values.js.map +1 -0
- package/dist/kalada-v1/schemas.cjs +136 -3
- package/dist/kalada-v1/schemas.cjs.map +1 -1
- package/dist/kalada-v1/schemas.d.cts +2 -1
- package/dist/kalada-v1/schemas.d.ts +2 -1
- package/dist/kalada-v1/schemas.js +137 -5
- package/dist/kalada-v1/schemas.js.map +1 -1
- package/dist/kalada-v1/static-analysis.cjs +177 -0
- package/dist/kalada-v1/static-analysis.cjs.map +1 -0
- package/dist/kalada-v1/static-analysis.d.cts +9 -0
- package/dist/kalada-v1/static-analysis.d.ts +9 -0
- package/dist/kalada-v1/static-analysis.js +175 -0
- package/dist/kalada-v1/static-analysis.js.map +1 -0
- package/dist/kalada-v1/static-types.cjs +229 -0
- package/dist/kalada-v1/static-types.cjs.map +1 -0
- package/dist/kalada-v1/static-types.d.cts +8 -0
- package/dist/kalada-v1/static-types.d.ts +8 -0
- package/dist/kalada-v1/static-types.js +227 -0
- package/dist/kalada-v1/static-types.js.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.cjs +95 -0
- package/dist/kalada-v1/temporal-evaluation.cjs.map +1 -0
- package/dist/kalada-v1/temporal-evaluation.d.cts +18 -0
- package/dist/kalada-v1/temporal-evaluation.d.ts +18 -0
- package/dist/kalada-v1/temporal-evaluation.js +90 -0
- package/dist/kalada-v1/temporal-evaluation.js.map +1 -0
- package/dist/kalada-v1/temporal.cjs +42 -0
- package/dist/kalada-v1/temporal.cjs.map +1 -0
- package/dist/kalada-v1/temporal.d.cts +22 -0
- package/dist/kalada-v1/temporal.d.ts +22 -0
- package/dist/kalada-v1/temporal.js +37 -0
- package/dist/kalada-v1/temporal.js.map +1 -0
- package/dist/kalada-v1/types.d.cts +108 -5
- package/dist/kalada-v1/types.d.ts +108 -5
- package/dist/kalada-v1/values.cjs +13 -1
- package/dist/kalada-v1/values.cjs.map +1 -1
- package/dist/kalada-v1/values.d.cts +2 -1
- package/dist/kalada-v1/values.d.ts +2 -1
- package/dist/kalada-v1/values.js +13 -1
- package/dist/kalada-v1/values.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { KaladaFailure } from './diagnostics.js';
|
|
2
|
+
import { EvaluationFrame, EvaluationTask, Path } from './evaluation-frames.js';
|
|
3
|
+
import { JsonValue } from './json.js';
|
|
4
|
+
import { ResolvedKaladaV1Limits } from './limits.js';
|
|
5
|
+
import { RuntimeValue, RuntimeEnvironment } from './runtime-values.js';
|
|
6
|
+
import { InstantValue } from './temporal.js';
|
|
7
|
+
import { KaladaV1Resolver, KaladaV1FunctionCapture, KaladaV1DiagnosticContextFrame, KaladaV1Expression } from './types.js';
|
|
8
|
+
import './values.js';
|
|
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 };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { KaladaFailure } from './diagnostics.js';
|
|
2
|
+
|
|
3
|
+
function evaluate(node, path, environment, state) {
|
|
4
|
+
state.task = { node, path, environment };
|
|
5
|
+
}
|
|
6
|
+
function deliver(value, state) {
|
|
7
|
+
state.value = value;
|
|
8
|
+
}
|
|
9
|
+
function push(frame, failurePath, state) {
|
|
10
|
+
ensureCapacity(failurePath, state);
|
|
11
|
+
state.stack.push(frame);
|
|
12
|
+
}
|
|
13
|
+
function ensureCapacity(path, state) {
|
|
14
|
+
if (state.stack.length >= state.limits.maxContinuationFrames) {
|
|
15
|
+
fail("KALADA_CONTINUATION_LIMIT", path);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function charge(path, state) {
|
|
19
|
+
if (state.steps >= state.limits.maxEvaluationSteps) fail("KALADA_EVALUATION_LIMIT", path);
|
|
20
|
+
state.steps += 1;
|
|
21
|
+
}
|
|
22
|
+
function reserveCollectionIteration(path, state) {
|
|
23
|
+
if (state.collectionIterations >= state.limits.maxCollectionIterations) {
|
|
24
|
+
fail("KALADA_COLLECTION_LIMIT", path);
|
|
25
|
+
}
|
|
26
|
+
state.collectionIterations += 1;
|
|
27
|
+
charge(path, state);
|
|
28
|
+
}
|
|
29
|
+
function copyCaptures(path, state) {
|
|
30
|
+
const output = /* @__PURE__ */ new Map();
|
|
31
|
+
for (const name of state.captures.get(pathKey(path)) ?? []) {
|
|
32
|
+
if (state.captured >= state.limits.maxCapturedBindings) fail("KALADA_CAPTURE_LIMIT", path);
|
|
33
|
+
charge(path, state);
|
|
34
|
+
state.captured += 1;
|
|
35
|
+
output.set(name, state.environment.get(name));
|
|
36
|
+
}
|
|
37
|
+
return output;
|
|
38
|
+
}
|
|
39
|
+
function reserveClosure(path, state) {
|
|
40
|
+
if (state.closures >= state.limits.maxClosures) fail("KALADA_CLOSURE_LIMIT", path);
|
|
41
|
+
charge(path, state);
|
|
42
|
+
state.closures += 1;
|
|
43
|
+
}
|
|
44
|
+
function captureMap(functions) {
|
|
45
|
+
return new Map(functions.map((item) => [pathKey(item.path), item.captures]));
|
|
46
|
+
}
|
|
47
|
+
function unwind(state) {
|
|
48
|
+
while (state.stack.length > 0) {
|
|
49
|
+
const frame = state.stack.pop();
|
|
50
|
+
if (frame.kind === "binding" || frame.kind === "match") state.environment = frame.outer;
|
|
51
|
+
if (frame.kind === "function-group-body") state.environment = frame.outer;
|
|
52
|
+
if (frame.kind === "user-return") {
|
|
53
|
+
state.environment = frame.caller;
|
|
54
|
+
state.callDepth -= 1;
|
|
55
|
+
}
|
|
56
|
+
if (frame.kind === "core-iteration") state.callDepth -= 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
function diagnosticContext(state) {
|
|
60
|
+
const context = [];
|
|
61
|
+
for (let index = state.stack.length - 1; index >= 0 && context.length < 32; index -= 1) {
|
|
62
|
+
const frame = state.stack[index];
|
|
63
|
+
if (frame.kind === "user-return") {
|
|
64
|
+
context.push({ kind: "function-call", name: frame.name, path: frame.path });
|
|
65
|
+
}
|
|
66
|
+
if (frame.kind === "core-iteration") {
|
|
67
|
+
context.push({ kind: "core-call", name: frame.operator, path: frame.path });
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return context;
|
|
71
|
+
}
|
|
72
|
+
function fail(code, path) {
|
|
73
|
+
throw new KaladaFailure(code, path);
|
|
74
|
+
}
|
|
75
|
+
function pathKey(path) {
|
|
76
|
+
return JSON.stringify(path);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
export { captureMap, charge, copyCaptures, deliver, diagnosticContext, ensureCapacity, evaluate, fail, push, reserveClosure, reserveCollectionIteration, unwind };
|
|
80
|
+
//# sourceMappingURL=evaluation-state.js.map
|
|
81
|
+
//# sourceMappingURL=evaluation-state.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/evaluation-state.ts"],"names":[],"mappings":"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","file":"evaluation-state.js","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"]}
|
|
@@ -30,6 +30,34 @@ const err = (value) => ({
|
|
|
30
30
|
});
|
|
31
31
|
const arm = (variant, body, name) => ({ variant, ...name === void 0 ? {} : { binding: name }, body });
|
|
32
32
|
const match = (type, value, arms) => ({ kind: "match", type, value, arms });
|
|
33
|
+
const instant = (milliseconds) => ({
|
|
34
|
+
kind: "instant",
|
|
35
|
+
milliseconds
|
|
36
|
+
});
|
|
37
|
+
const duration = (milliseconds) => ({
|
|
38
|
+
kind: "duration",
|
|
39
|
+
milliseconds
|
|
40
|
+
});
|
|
41
|
+
const currentInstant = () => ({
|
|
42
|
+
kind: "current-instant"
|
|
43
|
+
});
|
|
44
|
+
const temporalArithmetic = (operator, left, right) => ({ kind: "temporal-arithmetic", operator, left, right });
|
|
45
|
+
const temporalComparison = (operator, left, right) => ({ kind: "temporal-comparison", operator, left, right });
|
|
46
|
+
const functionExpression = (parameters, returns, body) => Object.freeze({ kind: "function", parameters: Object.freeze([...parameters]), returns, body });
|
|
47
|
+
const call = (callee, args) => Object.freeze({ kind: "call", callee, arguments: Object.freeze([...args]) });
|
|
48
|
+
const functionGroup = (functions, body) => Object.freeze({ kind: "function-group", functions: Object.freeze([...functions]), body });
|
|
49
|
+
const coreFunction = (name) => Object.freeze({ kind: "core-function", name });
|
|
50
|
+
const parameter = (name, type) => Object.freeze({ name, type });
|
|
51
|
+
const namedFunction = (name, parameters, returns, body) => Object.freeze({ name, parameters: Object.freeze([...parameters]), returns, body });
|
|
52
|
+
const primitiveType = (name) => Object.freeze({ kind: "primitive-type", name });
|
|
53
|
+
const optionType = (value) => Object.freeze({ kind: "option-type", value });
|
|
54
|
+
const resultType = (ok2, error) => Object.freeze({
|
|
55
|
+
kind: "result-type",
|
|
56
|
+
ok: ok2,
|
|
57
|
+
error
|
|
58
|
+
});
|
|
59
|
+
const arrayType = (element) => Object.freeze({ kind: "array-type", element });
|
|
60
|
+
const functionType = (parameters, returns) => Object.freeze({ kind: "function-type", parameters: Object.freeze([...parameters]), returns });
|
|
33
61
|
const KaladaV1 = Object.freeze({
|
|
34
62
|
literal,
|
|
35
63
|
ref,
|
|
@@ -38,6 +66,24 @@ const KaladaV1 = Object.freeze({
|
|
|
38
66
|
Result: Object.freeze({ ok, err }),
|
|
39
67
|
arm,
|
|
40
68
|
match,
|
|
69
|
+
instant,
|
|
70
|
+
duration,
|
|
71
|
+
currentInstant,
|
|
72
|
+
temporalArithmetic,
|
|
73
|
+
temporalComparison,
|
|
74
|
+
function: functionExpression,
|
|
75
|
+
call,
|
|
76
|
+
functionGroup,
|
|
77
|
+
coreFunction,
|
|
78
|
+
parameter,
|
|
79
|
+
namedFunction,
|
|
80
|
+
Type: Object.freeze({
|
|
81
|
+
primitive: primitiveType,
|
|
82
|
+
option: optionType,
|
|
83
|
+
result: resultType,
|
|
84
|
+
array: arrayType,
|
|
85
|
+
function: functionType
|
|
86
|
+
}),
|
|
41
87
|
program(expression) {
|
|
42
88
|
return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
|
|
43
89
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":["ok"],"mappings":"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","file":"factories.cjs","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type {\n KaladaCoreFunctionName,\n KaladaFunctionParameter,\n KaladaType,\n KaladaV1Expression,\n KaladaV1Program,\n MatchArm,\n NamedFunction,\n} from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\nconst instant = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"instant\",\n milliseconds,\n});\nconst duration = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"duration\",\n milliseconds,\n});\nconst currentInstant = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"current-instant\",\n});\nconst temporalArithmetic = <R extends JsonValue>(\n operator: \"add\" | \"subtract\",\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-arithmetic\", operator, left, right });\nconst temporalComparison = <R extends JsonValue>(\n operator: Extract<KaladaV1Expression<R>, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-comparison\", operator, left, right });\nconst functionExpression = <R extends JsonValue>(\n parameters: readonly KaladaFunctionParameter[],\n returns: KaladaType,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"function\", parameters: Object.freeze([...parameters]), returns, body });\nconst call = <R extends JsonValue>(\n callee: KaladaV1Expression<R>,\n args: readonly KaladaV1Expression<R>[],\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"call\", callee, arguments: Object.freeze([...args]) });\nconst functionGroup = <R extends JsonValue>(\n functions: readonly NamedFunction<R>[],\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"function-group\", functions: Object.freeze([...functions]), body });\nconst coreFunction = <R extends JsonValue = string>(\n name: KaladaCoreFunctionName,\n): KaladaV1Expression<R> => Object.freeze({ kind: \"core-function\", name });\nconst parameter = (name: string, type: KaladaType): KaladaFunctionParameter =>\n Object.freeze({ name, type });\nconst namedFunction = <R extends JsonValue>(\n name: string,\n parameters: readonly KaladaFunctionParameter[],\n returns: KaladaType,\n body: KaladaV1Expression<R>,\n): NamedFunction<R> =>\n Object.freeze({ name, parameters: Object.freeze([...parameters]), returns, body });\nconst primitiveType = (name: Extract<KaladaType, { kind: \"primitive-type\" }>[\"name\"]): KaladaType =>\n Object.freeze({ kind: \"primitive-type\", name });\nconst optionType = (value: KaladaType): KaladaType => Object.freeze({ kind: \"option-type\", value });\nconst resultType = (ok: KaladaType, error: KaladaType): KaladaType =>\n Object.freeze({\n kind: \"result-type\",\n ok,\n error,\n });\nconst arrayType = (element: KaladaType): KaladaType =>\n Object.freeze({ kind: \"array-type\", element });\nconst functionType = (parameters: readonly KaladaType[], returns: KaladaType): KaladaType =>\n Object.freeze({ kind: \"function-type\", parameters: Object.freeze([...parameters]), returns });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n instant,\n duration,\n currentInstant,\n temporalArithmetic,\n temporalComparison,\n function: functionExpression,\n call,\n functionGroup,\n coreFunction,\n parameter,\n namedFunction,\n Type: Object.freeze({\n primitive: primitiveType,\n option: optionType,\n result: resultType,\n array: arrayType,\n function: functionType,\n }),\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JsonValue } from './json.cjs';
|
|
2
|
-
import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.cjs';
|
|
2
|
+
import { KaladaV1Expression, MatchArm, KaladaFunctionParameter, KaladaType, NamedFunction, KaladaCoreFunctionName, KaladaV1Program } from './types.cjs';
|
|
3
|
+
import './temporal.cjs';
|
|
3
4
|
import './values.cjs';
|
|
4
5
|
|
|
5
6
|
declare const KaladaV1: Readonly<{
|
|
@@ -16,6 +17,28 @@ declare const KaladaV1: Readonly<{
|
|
|
16
17
|
}>;
|
|
17
18
|
arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
|
|
18
19
|
match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
|
|
20
|
+
instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
21
|
+
duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
22
|
+
currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
23
|
+
temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
24
|
+
temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
|
|
25
|
+
kind: "temporal-comparison";
|
|
26
|
+
}>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
27
|
+
function: <R extends JsonValue>(parameters: readonly KaladaFunctionParameter[], returns: KaladaType, body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
28
|
+
call: <R extends JsonValue>(callee: KaladaV1Expression<R>, args: readonly KaladaV1Expression<R>[]) => KaladaV1Expression<R>;
|
|
29
|
+
functionGroup: <R extends JsonValue>(functions: readonly NamedFunction<R>[], body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
30
|
+
coreFunction: <R extends JsonValue = string>(name: KaladaCoreFunctionName) => KaladaV1Expression<R>;
|
|
31
|
+
parameter: (name: string, type: KaladaType) => KaladaFunctionParameter;
|
|
32
|
+
namedFunction: <R extends JsonValue>(name: string, parameters: readonly KaladaFunctionParameter[], returns: KaladaType, body: KaladaV1Expression<R>) => NamedFunction<R>;
|
|
33
|
+
Type: Readonly<{
|
|
34
|
+
primitive: (name: Extract<KaladaType, {
|
|
35
|
+
kind: "primitive-type";
|
|
36
|
+
}>["name"]) => KaladaType;
|
|
37
|
+
option: (value: KaladaType) => KaladaType;
|
|
38
|
+
result: (ok: KaladaType, error: KaladaType) => KaladaType;
|
|
39
|
+
array: (element: KaladaType) => KaladaType;
|
|
40
|
+
function: (parameters: readonly KaladaType[], returns: KaladaType) => KaladaType;
|
|
41
|
+
}>;
|
|
19
42
|
program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
|
|
20
43
|
}>;
|
|
21
44
|
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { JsonValue } from './json.js';
|
|
2
|
-
import { KaladaV1Expression, MatchArm, KaladaV1Program } from './types.js';
|
|
2
|
+
import { KaladaV1Expression, MatchArm, KaladaFunctionParameter, KaladaType, NamedFunction, KaladaCoreFunctionName, KaladaV1Program } from './types.js';
|
|
3
|
+
import './temporal.js';
|
|
3
4
|
import './values.js';
|
|
4
5
|
|
|
5
6
|
declare const KaladaV1: Readonly<{
|
|
@@ -16,6 +17,28 @@ declare const KaladaV1: Readonly<{
|
|
|
16
17
|
}>;
|
|
17
18
|
arm: <R extends JsonValue>(variant: MatchArm<R>["variant"], body: KaladaV1Expression<R>, name?: string) => MatchArm<R>;
|
|
18
19
|
match: <R extends JsonValue>(type: "Option" | "Result", value: KaladaV1Expression<R>, arms: readonly MatchArm<R>[]) => KaladaV1Expression<R>;
|
|
20
|
+
instant: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
21
|
+
duration: <R extends JsonValue = string>(milliseconds: number) => KaladaV1Expression<R>;
|
|
22
|
+
currentInstant: <R extends JsonValue = string>() => KaladaV1Expression<R>;
|
|
23
|
+
temporalArithmetic: <R extends JsonValue>(operator: "add" | "subtract", left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
24
|
+
temporalComparison: <R extends JsonValue>(operator: Extract<KaladaV1Expression<R>, {
|
|
25
|
+
kind: "temporal-comparison";
|
|
26
|
+
}>["operator"], left: KaladaV1Expression<R>, right: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
27
|
+
function: <R extends JsonValue>(parameters: readonly KaladaFunctionParameter[], returns: KaladaType, body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
28
|
+
call: <R extends JsonValue>(callee: KaladaV1Expression<R>, args: readonly KaladaV1Expression<R>[]) => KaladaV1Expression<R>;
|
|
29
|
+
functionGroup: <R extends JsonValue>(functions: readonly NamedFunction<R>[], body: KaladaV1Expression<R>) => KaladaV1Expression<R>;
|
|
30
|
+
coreFunction: <R extends JsonValue = string>(name: KaladaCoreFunctionName) => KaladaV1Expression<R>;
|
|
31
|
+
parameter: (name: string, type: KaladaType) => KaladaFunctionParameter;
|
|
32
|
+
namedFunction: <R extends JsonValue>(name: string, parameters: readonly KaladaFunctionParameter[], returns: KaladaType, body: KaladaV1Expression<R>) => NamedFunction<R>;
|
|
33
|
+
Type: Readonly<{
|
|
34
|
+
primitive: (name: Extract<KaladaType, {
|
|
35
|
+
kind: "primitive-type";
|
|
36
|
+
}>["name"]) => KaladaType;
|
|
37
|
+
option: (value: KaladaType) => KaladaType;
|
|
38
|
+
result: (ok: KaladaType, error: KaladaType) => KaladaType;
|
|
39
|
+
array: (element: KaladaType) => KaladaType;
|
|
40
|
+
function: (parameters: readonly KaladaType[], returns: KaladaType) => KaladaType;
|
|
41
|
+
}>;
|
|
19
42
|
program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R>;
|
|
20
43
|
}>;
|
|
21
44
|
|
|
@@ -28,6 +28,34 @@ const err = (value) => ({
|
|
|
28
28
|
});
|
|
29
29
|
const arm = (variant, body, name) => ({ variant, ...name === void 0 ? {} : { binding: name }, body });
|
|
30
30
|
const match = (type, value, arms) => ({ kind: "match", type, value, arms });
|
|
31
|
+
const instant = (milliseconds) => ({
|
|
32
|
+
kind: "instant",
|
|
33
|
+
milliseconds
|
|
34
|
+
});
|
|
35
|
+
const duration = (milliseconds) => ({
|
|
36
|
+
kind: "duration",
|
|
37
|
+
milliseconds
|
|
38
|
+
});
|
|
39
|
+
const currentInstant = () => ({
|
|
40
|
+
kind: "current-instant"
|
|
41
|
+
});
|
|
42
|
+
const temporalArithmetic = (operator, left, right) => ({ kind: "temporal-arithmetic", operator, left, right });
|
|
43
|
+
const temporalComparison = (operator, left, right) => ({ kind: "temporal-comparison", operator, left, right });
|
|
44
|
+
const functionExpression = (parameters, returns, body) => Object.freeze({ kind: "function", parameters: Object.freeze([...parameters]), returns, body });
|
|
45
|
+
const call = (callee, args) => Object.freeze({ kind: "call", callee, arguments: Object.freeze([...args]) });
|
|
46
|
+
const functionGroup = (functions, body) => Object.freeze({ kind: "function-group", functions: Object.freeze([...functions]), body });
|
|
47
|
+
const coreFunction = (name) => Object.freeze({ kind: "core-function", name });
|
|
48
|
+
const parameter = (name, type) => Object.freeze({ name, type });
|
|
49
|
+
const namedFunction = (name, parameters, returns, body) => Object.freeze({ name, parameters: Object.freeze([...parameters]), returns, body });
|
|
50
|
+
const primitiveType = (name) => Object.freeze({ kind: "primitive-type", name });
|
|
51
|
+
const optionType = (value) => Object.freeze({ kind: "option-type", value });
|
|
52
|
+
const resultType = (ok2, error) => Object.freeze({
|
|
53
|
+
kind: "result-type",
|
|
54
|
+
ok: ok2,
|
|
55
|
+
error
|
|
56
|
+
});
|
|
57
|
+
const arrayType = (element) => Object.freeze({ kind: "array-type", element });
|
|
58
|
+
const functionType = (parameters, returns) => Object.freeze({ kind: "function-type", parameters: Object.freeze([...parameters]), returns });
|
|
31
59
|
const KaladaV1 = Object.freeze({
|
|
32
60
|
literal,
|
|
33
61
|
ref,
|
|
@@ -36,6 +64,24 @@ const KaladaV1 = Object.freeze({
|
|
|
36
64
|
Result: Object.freeze({ ok, err }),
|
|
37
65
|
arm,
|
|
38
66
|
match,
|
|
67
|
+
instant,
|
|
68
|
+
duration,
|
|
69
|
+
currentInstant,
|
|
70
|
+
temporalArithmetic,
|
|
71
|
+
temporalComparison,
|
|
72
|
+
function: functionExpression,
|
|
73
|
+
call,
|
|
74
|
+
functionGroup,
|
|
75
|
+
coreFunction,
|
|
76
|
+
parameter,
|
|
77
|
+
namedFunction,
|
|
78
|
+
Type: Object.freeze({
|
|
79
|
+
primitive: primitiveType,
|
|
80
|
+
option: optionType,
|
|
81
|
+
result: resultType,
|
|
82
|
+
array: arrayType,
|
|
83
|
+
function: functionType
|
|
84
|
+
}),
|
|
39
85
|
program(expression) {
|
|
40
86
|
return { format: "kalada-program", version: 1, profile: "kalada-v1", expression };
|
|
41
87
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/factories.ts"],"names":["ok"],"mappings":"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","file":"factories.js","sourcesContent":["import type { JsonValue } from \"./json.js\";\nimport type {\n KaladaCoreFunctionName,\n KaladaFunctionParameter,\n KaladaType,\n KaladaV1Expression,\n KaladaV1Program,\n MatchArm,\n NamedFunction,\n} from \"./types.js\";\n\nconst literal = <R extends JsonValue = string>(value: JsonValue): KaladaV1Expression<R> => ({\n kind: \"literal\",\n value,\n});\nconst ref = <R extends JsonValue = string>(value: R): KaladaV1Expression<R> => ({\n kind: \"ref\",\n ref: value,\n});\nconst binding = <R extends JsonValue>(\n name: string,\n value: KaladaV1Expression<R>,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"binding\", name, value, body });\nconst some = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"some\",\n value,\n});\nconst none = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"option\",\n variant: \"none\",\n});\nconst ok = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"ok\",\n value,\n});\nconst err = <R extends JsonValue>(value: KaladaV1Expression<R>): KaladaV1Expression<R> => ({\n kind: \"result\",\n variant: \"err\",\n value,\n});\nconst arm = <R extends JsonValue>(\n variant: MatchArm<R>[\"variant\"],\n body: KaladaV1Expression<R>,\n name?: string,\n): MatchArm<R> => ({ variant, ...(name === undefined ? {} : { binding: name }), body });\nconst match = <R extends JsonValue>(\n type: \"Option\" | \"Result\",\n value: KaladaV1Expression<R>,\n arms: readonly MatchArm<R>[],\n): KaladaV1Expression<R> => ({ kind: \"match\", type, value, arms });\nconst instant = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"instant\",\n milliseconds,\n});\nconst duration = <R extends JsonValue = string>(milliseconds: number): KaladaV1Expression<R> => ({\n kind: \"duration\",\n milliseconds,\n});\nconst currentInstant = <R extends JsonValue = string>(): KaladaV1Expression<R> => ({\n kind: \"current-instant\",\n});\nconst temporalArithmetic = <R extends JsonValue>(\n operator: \"add\" | \"subtract\",\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-arithmetic\", operator, left, right });\nconst temporalComparison = <R extends JsonValue>(\n operator: Extract<KaladaV1Expression<R>, { kind: \"temporal-comparison\" }>[\"operator\"],\n left: KaladaV1Expression<R>,\n right: KaladaV1Expression<R>,\n): KaladaV1Expression<R> => ({ kind: \"temporal-comparison\", operator, left, right });\nconst functionExpression = <R extends JsonValue>(\n parameters: readonly KaladaFunctionParameter[],\n returns: KaladaType,\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"function\", parameters: Object.freeze([...parameters]), returns, body });\nconst call = <R extends JsonValue>(\n callee: KaladaV1Expression<R>,\n args: readonly KaladaV1Expression<R>[],\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"call\", callee, arguments: Object.freeze([...args]) });\nconst functionGroup = <R extends JsonValue>(\n functions: readonly NamedFunction<R>[],\n body: KaladaV1Expression<R>,\n): KaladaV1Expression<R> =>\n Object.freeze({ kind: \"function-group\", functions: Object.freeze([...functions]), body });\nconst coreFunction = <R extends JsonValue = string>(\n name: KaladaCoreFunctionName,\n): KaladaV1Expression<R> => Object.freeze({ kind: \"core-function\", name });\nconst parameter = (name: string, type: KaladaType): KaladaFunctionParameter =>\n Object.freeze({ name, type });\nconst namedFunction = <R extends JsonValue>(\n name: string,\n parameters: readonly KaladaFunctionParameter[],\n returns: KaladaType,\n body: KaladaV1Expression<R>,\n): NamedFunction<R> =>\n Object.freeze({ name, parameters: Object.freeze([...parameters]), returns, body });\nconst primitiveType = (name: Extract<KaladaType, { kind: \"primitive-type\" }>[\"name\"]): KaladaType =>\n Object.freeze({ kind: \"primitive-type\", name });\nconst optionType = (value: KaladaType): KaladaType => Object.freeze({ kind: \"option-type\", value });\nconst resultType = (ok: KaladaType, error: KaladaType): KaladaType =>\n Object.freeze({\n kind: \"result-type\",\n ok,\n error,\n });\nconst arrayType = (element: KaladaType): KaladaType =>\n Object.freeze({ kind: \"array-type\", element });\nconst functionType = (parameters: readonly KaladaType[], returns: KaladaType): KaladaType =>\n Object.freeze({ kind: \"function-type\", parameters: Object.freeze([...parameters]), returns });\n\nexport const KaladaV1 = Object.freeze({\n literal,\n ref,\n binding,\n Option: Object.freeze({ some, none }),\n Result: Object.freeze({ ok, err }),\n arm,\n match,\n instant,\n duration,\n currentInstant,\n temporalArithmetic,\n temporalComparison,\n function: functionExpression,\n call,\n functionGroup,\n coreFunction,\n parameter,\n namedFunction,\n Type: Object.freeze({\n primitive: primitiveType,\n option: optionType,\n result: resultType,\n array: arrayType,\n function: functionType,\n }),\n program<R extends JsonValue = string>(expression: KaladaV1Expression<R>): KaladaV1Program<R> {\n return { format: \"kalada-program\", version: 1, profile: \"kalada-v1\", expression };\n },\n});\n"]}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var canonicalInput_js = require('./canonical-input.js');
|
|
4
|
+
var diagnostics_js = require('./diagnostics.js');
|
|
5
|
+
|
|
6
|
+
const TYPE_KEYS = /* @__PURE__ */ new Set([
|
|
7
|
+
"kind",
|
|
8
|
+
"name",
|
|
9
|
+
"value",
|
|
10
|
+
"ok",
|
|
11
|
+
"error",
|
|
12
|
+
"element",
|
|
13
|
+
"parameters",
|
|
14
|
+
"returns"
|
|
15
|
+
]);
|
|
16
|
+
const PRIMITIVES = /* @__PURE__ */ new Set(["null", "boolean", "number", "string", "json", "Instant", "Duration"]);
|
|
17
|
+
function canonicalFunction(raw, path, depth, state, read) {
|
|
18
|
+
canonicalInput_js.exact(raw, path, ["kind", "parameters", "returns", "body"]);
|
|
19
|
+
const parameters = canonicalParameters(raw.parameters, [...path, "parameters"], depth + 1, state);
|
|
20
|
+
const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
|
|
21
|
+
const body = read(raw.body, [...path, "body"], depth + 1, state);
|
|
22
|
+
return Object.freeze({ kind: "function", parameters, returns, body });
|
|
23
|
+
}
|
|
24
|
+
function canonicalCall(raw, path, depth, state, read) {
|
|
25
|
+
canonicalInput_js.exact(raw, path, ["kind", "callee", "arguments"]);
|
|
26
|
+
const callee = read(raw.callee, [...path, "callee"], depth + 1, state);
|
|
27
|
+
const args = array(raw.arguments, [...path, "arguments"]);
|
|
28
|
+
const output = args.map(
|
|
29
|
+
(item, index) => read(item, [...path, "arguments", index], depth + 1, state)
|
|
30
|
+
);
|
|
31
|
+
return Object.freeze({ kind: "call", callee, arguments: Object.freeze(output) });
|
|
32
|
+
}
|
|
33
|
+
function canonicalGroup(raw, path, depth, state, read) {
|
|
34
|
+
canonicalInput_js.exact(raw, path, ["kind", "functions", "body"]);
|
|
35
|
+
const entries = array(raw.functions, [...path, "functions"]);
|
|
36
|
+
if (entries.length > state.limits.maxFunctionGroupSize) limit([...path, "functions"]);
|
|
37
|
+
const names = /* @__PURE__ */ new Set();
|
|
38
|
+
const functions = entries.map((item, index) => {
|
|
39
|
+
const member = canonicalMember(item, [...path, "functions", index], depth + 1, state, read);
|
|
40
|
+
if (names.has(member.name)) duplicate([...path, "functions", index, "name"]);
|
|
41
|
+
names.add(member.name);
|
|
42
|
+
return member;
|
|
43
|
+
});
|
|
44
|
+
const body = read(raw.body, [...path, "body"], depth + 1, state);
|
|
45
|
+
return Object.freeze({ kind: "function-group", functions: Object.freeze(functions), body });
|
|
46
|
+
}
|
|
47
|
+
function canonicalCoreFunction(raw, path) {
|
|
48
|
+
canonicalInput_js.exact(raw, path, ["kind", "name"]);
|
|
49
|
+
if (raw.name !== "map" && raw.name !== "filter" && raw.name !== "some" && raw.name !== "every") {
|
|
50
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", [...path, "name"]);
|
|
51
|
+
}
|
|
52
|
+
return Object.freeze({ kind: "core-function", name: raw.name });
|
|
53
|
+
}
|
|
54
|
+
function canonicalType(input, path, depth, state) {
|
|
55
|
+
canonicalInput_js.count(path, depth, state);
|
|
56
|
+
if (typeof input !== "object" || input === null || state.active.has(input)) {
|
|
57
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", path);
|
|
58
|
+
}
|
|
59
|
+
state.active.add(input);
|
|
60
|
+
try {
|
|
61
|
+
const raw = canonicalInput_js.properties(input, path, TYPE_KEYS, false);
|
|
62
|
+
if (raw.kind === "primitive-type") return primitiveType(raw, path);
|
|
63
|
+
if (raw.kind === "option-type")
|
|
64
|
+
return unaryType(raw, path, depth, state, "option-type", "value");
|
|
65
|
+
if (raw.kind === "array-type")
|
|
66
|
+
return unaryType(raw, path, depth, state, "array-type", "element");
|
|
67
|
+
if (raw.kind === "result-type") return resultType(raw, path, depth, state);
|
|
68
|
+
if (raw.kind === "function-type") return functionType(raw, path, depth, state);
|
|
69
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", [...path, "kind"]);
|
|
70
|
+
} finally {
|
|
71
|
+
state.active.delete(input);
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
function canonicalMember(input, path, depth, state, read) {
|
|
75
|
+
canonicalInput_js.count(path, depth, state);
|
|
76
|
+
const raw = canonicalInput_js.properties(input, path, /* @__PURE__ */ new Set(["name", "parameters", "returns", "body"]));
|
|
77
|
+
const name = canonicalInput_js.bindingName(raw.name, [...path, "name"], state.limits);
|
|
78
|
+
const parameters = canonicalParameters(raw.parameters, [...path, "parameters"], depth + 1, state);
|
|
79
|
+
const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
|
|
80
|
+
const body = read(raw.body, [...path, "body"], depth + 1, state);
|
|
81
|
+
return Object.freeze({ name, parameters, returns, body });
|
|
82
|
+
}
|
|
83
|
+
function canonicalParameters(input, path, depth, state) {
|
|
84
|
+
const entries = array(input, path);
|
|
85
|
+
if (entries.length > state.limits.maxFunctionParameters) limit(path);
|
|
86
|
+
const names = /* @__PURE__ */ new Set();
|
|
87
|
+
const output = entries.map((item, index) => {
|
|
88
|
+
const itemPath = [...path, index];
|
|
89
|
+
canonicalInput_js.count(itemPath, depth, state);
|
|
90
|
+
const raw = canonicalInput_js.properties(item, itemPath, /* @__PURE__ */ new Set(["name", "type"]));
|
|
91
|
+
const name = canonicalInput_js.bindingName(raw.name, [...itemPath, "name"], state.limits);
|
|
92
|
+
if (names.has(name)) duplicate([...itemPath, "name"]);
|
|
93
|
+
names.add(name);
|
|
94
|
+
return Object.freeze({
|
|
95
|
+
name,
|
|
96
|
+
type: canonicalType(raw.type, [...itemPath, "type"], depth + 1, state)
|
|
97
|
+
});
|
|
98
|
+
});
|
|
99
|
+
return Object.freeze(output);
|
|
100
|
+
}
|
|
101
|
+
function functionType(raw, path, depth, state) {
|
|
102
|
+
canonicalInput_js.exact(raw, path, ["kind", "parameters", "returns"]);
|
|
103
|
+
const entries = array(raw.parameters, [...path, "parameters"]);
|
|
104
|
+
if (entries.length > state.limits.maxFunctionParameters) limit([...path, "parameters"]);
|
|
105
|
+
const parameters = entries.map(
|
|
106
|
+
(item, index) => canonicalType(item, [...path, "parameters", index], depth + 1, state)
|
|
107
|
+
);
|
|
108
|
+
const returns = canonicalType(raw.returns, [...path, "returns"], depth + 1, state);
|
|
109
|
+
return Object.freeze({ kind: "function-type", parameters: Object.freeze(parameters), returns });
|
|
110
|
+
}
|
|
111
|
+
function primitiveType(raw, path) {
|
|
112
|
+
canonicalInput_js.exact(raw, path, ["kind", "name"]);
|
|
113
|
+
if (typeof raw.name !== "string" || !PRIMITIVES.has(raw.name)) {
|
|
114
|
+
throw new diagnostics_js.KaladaFailure("KALADA_INVALID_FUNCTION_TYPE", [...path, "name"]);
|
|
115
|
+
}
|
|
116
|
+
return Object.freeze({ kind: "primitive-type", name: raw.name });
|
|
117
|
+
}
|
|
118
|
+
function unaryType(raw, path, depth, state, kind, key) {
|
|
119
|
+
canonicalInput_js.exact(raw, path, ["kind", key]);
|
|
120
|
+
return Object.freeze({
|
|
121
|
+
kind,
|
|
122
|
+
[key]: canonicalType(raw[key], [...path, key], depth + 1, state)
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
function resultType(raw, path, depth, state) {
|
|
126
|
+
canonicalInput_js.exact(raw, path, ["kind", "ok", "error"]);
|
|
127
|
+
return Object.freeze({
|
|
128
|
+
kind: "result-type",
|
|
129
|
+
ok: canonicalType(raw.ok, [...path, "ok"], depth + 1, state),
|
|
130
|
+
error: canonicalType(raw.error, [...path, "error"], depth + 1, state)
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
function array(input, path) {
|
|
134
|
+
if (!Array.isArray(input)) throw new diagnostics_js.KaladaFailure("KALADA_INVALID_INPUT", path);
|
|
135
|
+
return canonicalInput_js.strictArray(input, path);
|
|
136
|
+
}
|
|
137
|
+
function limit(path) {
|
|
138
|
+
throw new diagnostics_js.KaladaFailure("KALADA_LIMIT_EXCEEDED", path);
|
|
139
|
+
}
|
|
140
|
+
function duplicate(path) {
|
|
141
|
+
throw new diagnostics_js.KaladaFailure("KALADA_DUPLICATE_BINDING", path);
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
exports.canonicalCall = canonicalCall;
|
|
145
|
+
exports.canonicalCoreFunction = canonicalCoreFunction;
|
|
146
|
+
exports.canonicalFunction = canonicalFunction;
|
|
147
|
+
exports.canonicalGroup = canonicalGroup;
|
|
148
|
+
exports.canonicalType = canonicalType;
|
|
149
|
+
//# sourceMappingURL=function-contracts.cjs.map
|
|
150
|
+
//# sourceMappingURL=function-contracts.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../src/kalada-v1/function-contracts.ts"],"names":["exact","KaladaFailure","count","properties","bindingName","strictArray"],"mappings":"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","file":"function-contracts.cjs","sourcesContent":["import {\n bindingName,\n type CanonicalState,\n count,\n exact,\n type Path,\n properties,\n strictArray,\n} from \"./canonical-input.js\";\nimport { KaladaFailure } from \"./diagnostics.js\";\nimport type { JsonValue } from \"./json.js\";\nimport type {\n CallExpression,\n CoreFunctionExpression,\n FunctionExpression,\n FunctionGroupExpression,\n KaladaFunctionParameter,\n KaladaType,\n KaladaV1Expression,\n NamedFunction,\n} from \"./types.js\";\n\ntype NodeReader<R extends JsonValue> = (\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n) => KaladaV1Expression<R>;\n\nconst TYPE_KEYS = new Set([\n \"kind\",\n \"name\",\n \"value\",\n \"ok\",\n \"error\",\n \"element\",\n \"parameters\",\n \"returns\",\n]);\nconst PRIMITIVES = new Set([\"null\", \"boolean\", \"number\", \"string\", \"json\", \"Instant\", \"Duration\"]);\n\nexport function canonicalFunction<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): FunctionExpression<R> {\n exact(raw, path, [\"kind\", \"parameters\", \"returns\", \"body\"]);\n const parameters = canonicalParameters(raw.parameters, [...path, \"parameters\"], depth + 1, state);\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ kind: \"function\", parameters, returns, body });\n}\n\nexport function canonicalCall<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): CallExpression<R> {\n exact(raw, path, [\"kind\", \"callee\", \"arguments\"]);\n const callee = read(raw.callee, [...path, \"callee\"], depth + 1, state);\n const args = array(raw.arguments, [...path, \"arguments\"]);\n const output = args.map((item, index) =>\n read(item, [...path, \"arguments\", index], depth + 1, state),\n );\n return Object.freeze({ kind: \"call\", callee, arguments: Object.freeze(output) });\n}\n\nexport function canonicalGroup<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): FunctionGroupExpression<R> {\n exact(raw, path, [\"kind\", \"functions\", \"body\"]);\n const entries = array(raw.functions, [...path, \"functions\"]);\n if (entries.length > state.limits.maxFunctionGroupSize) limit([...path, \"functions\"]);\n const names = new Set<string>();\n const functions = entries.map((item, index) => {\n const member = canonicalMember(item, [...path, \"functions\", index], depth + 1, state, read);\n if (names.has(member.name)) duplicate([...path, \"functions\", index, \"name\"]);\n names.add(member.name);\n return member;\n });\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ kind: \"function-group\", functions: Object.freeze(functions), body });\n}\n\nexport function canonicalCoreFunction(\n raw: Record<string, unknown>,\n path: Path,\n): CoreFunctionExpression {\n exact(raw, path, [\"kind\", \"name\"]);\n if (raw.name !== \"map\" && raw.name !== \"filter\" && raw.name !== \"some\" && raw.name !== \"every\") {\n throw new KaladaFailure(\"KALADA_INVALID_INPUT\", [...path, \"name\"]);\n }\n return Object.freeze({ kind: \"core-function\", name: raw.name });\n}\n\nexport function canonicalType<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n count(path, depth, state);\n if (typeof input !== \"object\" || input === null || state.active.has(input)) {\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", path);\n }\n state.active.add(input);\n try {\n const raw = properties(input, path, TYPE_KEYS, false);\n if (raw.kind === \"primitive-type\") return primitiveType(raw, path);\n if (raw.kind === \"option-type\")\n return unaryType(raw, path, depth, state, \"option-type\", \"value\");\n if (raw.kind === \"array-type\")\n return unaryType(raw, path, depth, state, \"array-type\", \"element\");\n if (raw.kind === \"result-type\") return resultType(raw, path, depth, state);\n if (raw.kind === \"function-type\") return functionType(raw, path, depth, state);\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", [...path, \"kind\"]);\n } finally {\n state.active.delete(input);\n }\n}\n\nfunction canonicalMember<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n read: NodeReader<R>,\n): NamedFunction<R> {\n count(path, depth, state);\n const raw = properties(input, path, new Set([\"name\", \"parameters\", \"returns\", \"body\"]));\n const name = bindingName(raw.name, [...path, \"name\"], state.limits);\n const parameters = canonicalParameters(raw.parameters, [...path, \"parameters\"], depth + 1, state);\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n const body = read(raw.body, [...path, \"body\"], depth + 1, state);\n return Object.freeze({ name, parameters, returns, body });\n}\n\nfunction canonicalParameters<R extends JsonValue>(\n input: unknown,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): readonly KaladaFunctionParameter[] {\n const entries = array(input, path);\n if (entries.length > state.limits.maxFunctionParameters) limit(path);\n const names = new Set<string>();\n const output = entries.map((item, index) => {\n const itemPath = [...path, index];\n count(itemPath, depth, state);\n const raw = properties(item, itemPath, new Set([\"name\", \"type\"]));\n const name = bindingName(raw.name, [...itemPath, \"name\"], state.limits);\n if (names.has(name)) duplicate([...itemPath, \"name\"]);\n names.add(name);\n return Object.freeze({\n name,\n type: canonicalType(raw.type, [...itemPath, \"type\"], depth + 1, state),\n });\n });\n return Object.freeze(output);\n}\n\nfunction functionType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n exact(raw, path, [\"kind\", \"parameters\", \"returns\"]);\n const entries = array(raw.parameters, [...path, \"parameters\"]);\n if (entries.length > state.limits.maxFunctionParameters) limit([...path, \"parameters\"]);\n const parameters = entries.map((item, index) =>\n canonicalType(item, [...path, \"parameters\", index], depth + 1, state),\n );\n const returns = canonicalType(raw.returns, [...path, \"returns\"], depth + 1, state);\n return Object.freeze({ kind: \"function-type\", parameters: Object.freeze(parameters), returns });\n}\n\nfunction primitiveType(raw: Record<string, unknown>, path: Path): KaladaType {\n exact(raw, path, [\"kind\", \"name\"]);\n if (typeof raw.name !== \"string\" || !PRIMITIVES.has(raw.name)) {\n throw new KaladaFailure(\"KALADA_INVALID_FUNCTION_TYPE\", [...path, \"name\"]);\n }\n return Object.freeze({ kind: \"primitive-type\", name: raw.name }) as KaladaType;\n}\n\nfunction unaryType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n kind: \"option-type\" | \"array-type\",\n key: \"value\" | \"element\",\n): KaladaType {\n exact(raw, path, [\"kind\", key]);\n return Object.freeze({\n kind,\n [key]: canonicalType(raw[key], [...path, key], depth + 1, state),\n }) as KaladaType;\n}\n\nfunction resultType<R extends JsonValue>(\n raw: Record<string, unknown>,\n path: Path,\n depth: number,\n state: CanonicalState<R>,\n): KaladaType {\n exact(raw, path, [\"kind\", \"ok\", \"error\"]);\n return Object.freeze({\n kind: \"result-type\",\n ok: canonicalType(raw.ok, [...path, \"ok\"], depth + 1, state),\n error: canonicalType(raw.error, [...path, \"error\"], depth + 1, state),\n });\n}\n\nfunction array(input: unknown, path: Path): unknown[] {\n if (!Array.isArray(input)) throw new KaladaFailure(\"KALADA_INVALID_INPUT\", path);\n return strictArray(input, path);\n}\n\nfunction limit(path: Path): never {\n throw new KaladaFailure(\"KALADA_LIMIT_EXCEEDED\", path);\n}\nfunction duplicate(path: Path): never {\n throw new KaladaFailure(\"KALADA_DUPLICATE_BINDING\", path);\n}\n"]}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Path, CanonicalState } from './canonical-input.cjs';
|
|
2
|
+
import { JsonValue } from './json.cjs';
|
|
3
|
+
import { KaladaV1Expression, CallExpression, CoreFunctionExpression, FunctionExpression, FunctionGroupExpression, KaladaType } from './types.cjs';
|
|
4
|
+
import './limits.cjs';
|
|
5
|
+
import './temporal.cjs';
|
|
6
|
+
import './values.cjs';
|
|
7
|
+
|
|
8
|
+
type NodeReader<R extends JsonValue> = (input: unknown, path: Path, depth: number, state: CanonicalState<R>) => KaladaV1Expression<R>;
|
|
9
|
+
declare function canonicalFunction<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): FunctionExpression<R>;
|
|
10
|
+
declare function canonicalCall<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): CallExpression<R>;
|
|
11
|
+
declare function canonicalGroup<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): FunctionGroupExpression<R>;
|
|
12
|
+
declare function canonicalCoreFunction(raw: Record<string, unknown>, path: Path): CoreFunctionExpression;
|
|
13
|
+
declare function canonicalType<R extends JsonValue>(input: unknown, path: Path, depth: number, state: CanonicalState<R>): KaladaType;
|
|
14
|
+
|
|
15
|
+
export { canonicalCall, canonicalCoreFunction, canonicalFunction, canonicalGroup, canonicalType };
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Path, CanonicalState } from './canonical-input.js';
|
|
2
|
+
import { JsonValue } from './json.js';
|
|
3
|
+
import { KaladaV1Expression, CallExpression, CoreFunctionExpression, FunctionExpression, FunctionGroupExpression, KaladaType } from './types.js';
|
|
4
|
+
import './limits.js';
|
|
5
|
+
import './temporal.js';
|
|
6
|
+
import './values.js';
|
|
7
|
+
|
|
8
|
+
type NodeReader<R extends JsonValue> = (input: unknown, path: Path, depth: number, state: CanonicalState<R>) => KaladaV1Expression<R>;
|
|
9
|
+
declare function canonicalFunction<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): FunctionExpression<R>;
|
|
10
|
+
declare function canonicalCall<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): CallExpression<R>;
|
|
11
|
+
declare function canonicalGroup<R extends JsonValue>(raw: Record<string, unknown>, path: Path, depth: number, state: CanonicalState<R>, read: NodeReader<R>): FunctionGroupExpression<R>;
|
|
12
|
+
declare function canonicalCoreFunction(raw: Record<string, unknown>, path: Path): CoreFunctionExpression;
|
|
13
|
+
declare function canonicalType<R extends JsonValue>(input: unknown, path: Path, depth: number, state: CanonicalState<R>): KaladaType;
|
|
14
|
+
|
|
15
|
+
export { canonicalCall, canonicalCoreFunction, canonicalFunction, canonicalGroup, canonicalType };
|