@lionlang/core 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/README.md +2 -0
  2. package/dist/analysis/analyze.d.mts +34 -0
  3. package/dist/analysis/analyze.d.mts.map +1 -0
  4. package/dist/analysis/analyze.mjs +181 -0
  5. package/dist/analysis/analyze.mjs.map +1 -0
  6. package/dist/environment-BQw8BPXl.d.mts +25 -0
  7. package/dist/{environment-k2Uf6VVc.d.mts.map → environment-BQw8BPXl.d.mts.map} +1 -1
  8. package/dist/errors/evaluation.d.mts +1 -1
  9. package/dist/errors/evaluation.mjs +2 -2
  10. package/dist/errors/evaluation.mjs.map +1 -1
  11. package/dist/{evaluate-D7ODMrbg.mjs → evaluate-BJOG7kaS.mjs} +36 -33
  12. package/dist/evaluate-BJOG7kaS.mjs.map +1 -0
  13. package/dist/evaluation/base-forms/array.d.mts +5 -6
  14. package/dist/evaluation/base-forms/array.d.mts.map +1 -1
  15. package/dist/evaluation/base-forms/array.mjs +1 -1
  16. package/dist/evaluation/base-forms/primitive.d.mts +2 -2
  17. package/dist/evaluation/base-forms/primitive.mjs +2 -2
  18. package/dist/evaluation/base-forms/primitive.mjs.map +1 -1
  19. package/dist/evaluation/base-forms/record.d.mts +5 -5
  20. package/dist/evaluation/base-forms/record.d.mts.map +1 -1
  21. package/dist/evaluation/base-forms/record.mjs +1 -1
  22. package/dist/evaluation/environment.d.mts +1 -1
  23. package/dist/evaluation/environment.d.mts.map +1 -1
  24. package/dist/evaluation/environment.mjs +10 -7
  25. package/dist/evaluation/environment.mjs.map +1 -1
  26. package/dist/evaluation/evaluate.d.mts +5 -6
  27. package/dist/evaluation/evaluate.d.mts.map +1 -1
  28. package/dist/evaluation/evaluate.mjs +1 -1
  29. package/dist/evaluation/special-forms/begin.d.mts +4 -4
  30. package/dist/evaluation/special-forms/begin.d.mts.map +1 -1
  31. package/dist/evaluation/special-forms/begin.mjs +1 -1
  32. package/dist/evaluation/special-forms/cond.d.mts +4 -5
  33. package/dist/evaluation/special-forms/cond.d.mts.map +1 -1
  34. package/dist/evaluation/special-forms/cond.mjs +1 -1
  35. package/dist/evaluation/special-forms/define.d.mts +4 -4
  36. package/dist/evaluation/special-forms/define.d.mts.map +1 -1
  37. package/dist/evaluation/special-forms/define.mjs +1 -1
  38. package/dist/evaluation/special-forms/eval.d.mts +4 -5
  39. package/dist/evaluation/special-forms/eval.d.mts.map +1 -1
  40. package/dist/evaluation/special-forms/eval.mjs +1 -1
  41. package/dist/evaluation/special-forms/function.d.mts +4 -5
  42. package/dist/evaluation/special-forms/function.d.mts.map +1 -1
  43. package/dist/evaluation/special-forms/function.mjs +1 -1
  44. package/dist/evaluation/special-forms/lambda.d.mts +4 -4
  45. package/dist/evaluation/special-forms/lambda.d.mts.map +1 -1
  46. package/dist/evaluation/special-forms/lambda.mjs +1 -1
  47. package/dist/evaluation/special-forms/match.d.mts +4 -5
  48. package/dist/evaluation/special-forms/match.d.mts.map +1 -1
  49. package/dist/evaluation/special-forms/match.mjs +1 -1
  50. package/dist/evaluation/special-forms/quote.d.mts +1 -1
  51. package/dist/evaluation-B6K0DbPS.d.mts +14 -0
  52. package/dist/evaluation-B6K0DbPS.d.mts.map +1 -0
  53. package/dist/evaluation-Bs36vy1h.d.mts +12 -0
  54. package/dist/evaluation-Bs36vy1h.d.mts.map +1 -0
  55. package/dist/evaluation-Dwo4KN_D.d.mts +9 -0
  56. package/dist/evaluation-Dwo4KN_D.d.mts.map +1 -0
  57. package/dist/{json-primitive-DUaaoNff.d.mts → json-primitive-gcv9Q1E4.d.mts} +2 -2
  58. package/dist/json-primitive-gcv9Q1E4.d.mts.map +1 -0
  59. package/dist/lion-expression-DMR7Psmu.d.mts +16 -0
  60. package/dist/lion-expression-DMR7Psmu.d.mts.map +1 -0
  61. package/dist/modules/array.d.mts +9 -10
  62. package/dist/modules/array.d.mts.map +1 -1
  63. package/dist/modules/array.mjs +9 -5
  64. package/dist/modules/array.mjs.map +1 -1
  65. package/dist/modules/boolean.d.mts +8 -9
  66. package/dist/modules/boolean.d.mts.map +1 -1
  67. package/dist/modules/boolean.mjs +6 -6
  68. package/dist/modules/boolean.mjs.map +1 -1
  69. package/dist/modules/console.mjs.map +1 -1
  70. package/dist/modules/lib/shared.d.mts +1 -2
  71. package/dist/modules/lib/shared.d.mts.map +1 -1
  72. package/dist/modules/lib/shared.mjs +1 -1
  73. package/dist/modules/lib/shared.mjs.map +1 -1
  74. package/dist/modules/number.d.mts +10 -11
  75. package/dist/modules/number.d.mts.map +1 -1
  76. package/dist/modules/number.mjs +9 -9
  77. package/dist/modules/number.mjs.map +1 -1
  78. package/dist/modules/object.d.mts +39 -59
  79. package/dist/modules/object.d.mts.map +1 -1
  80. package/dist/modules/object.mjs +12 -18
  81. package/dist/modules/object.mjs.map +1 -1
  82. package/dist/modules/string.d.mts +8 -9
  83. package/dist/modules/string.d.mts.map +1 -1
  84. package/dist/modules/string.mjs +6 -6
  85. package/dist/modules/string.mjs.map +1 -1
  86. package/dist/schemas/environment.d.mts +1 -1
  87. package/dist/schemas/environment.mjs +3 -3
  88. package/dist/schemas/environment.mjs.map +1 -1
  89. package/dist/schemas/evaluation.d.mts +17 -17
  90. package/dist/schemas/evaluation.d.mts.map +1 -1
  91. package/dist/schemas/evaluation.mjs +23 -15
  92. package/dist/schemas/evaluation.mjs.map +1 -1
  93. package/dist/schemas/json-primitive.d.mts +1 -1
  94. package/dist/schemas/json-primitive.mjs +6 -1
  95. package/dist/schemas/json-primitive.mjs.map +1 -1
  96. package/dist/schemas/lion-expression.d.mts +1 -1
  97. package/dist/schemas/lion-expression.mjs +6 -5
  98. package/dist/schemas/lion-expression.mjs.map +1 -1
  99. package/dist/services/evaluation.d.mts +2 -2
  100. package/dist/services/evaluation.mjs +3 -4
  101. package/dist/services/evaluation.mjs.map +1 -1
  102. package/dist/types/evaluation.d.mts +1 -1
  103. package/package.json +7 -6
  104. package/dist/environment-k2Uf6VVc.d.mts +0 -25
  105. package/dist/evaluate-D7ODMrbg.mjs.map +0 -1
  106. package/dist/evaluation-AblffSQw.d.mts +0 -17
  107. package/dist/evaluation-AblffSQw.d.mts.map +0 -1
  108. package/dist/evaluation-EqzK8tQV.d.mts +0 -13
  109. package/dist/evaluation-EqzK8tQV.d.mts.map +0 -1
  110. package/dist/evaluation-uwZSKxIf.d.mts +0 -10
  111. package/dist/evaluation-uwZSKxIf.d.mts.map +0 -1
  112. package/dist/json-primitive-DUaaoNff.d.mts.map +0 -1
  113. package/dist/lion-expression-6Y3itx9l.d.mts +0 -16
  114. package/dist/lion-expression-6Y3itx9l.d.mts.map +0 -1
package/README.md CHANGED
@@ -2,6 +2,8 @@
2
2
 
3
3
  Lion is a JSON-based Lisp. Every Lion program is valid JSON, which makes it easy to serialize, store, inspect, and generate from other systems.
4
4
 
5
+ The evaluator runs on Effect v4.
6
+
5
7
  Lion evaluates:
6
8
 
7
9
  - JSON primitives directly
@@ -0,0 +1,34 @@
1
+ import { a as LionExpressionType } from "../lion-expression-DMR7Psmu.mjs";
2
+
3
+ //#region src/analysis/analyze.d.ts
4
+ type StructuralPath = readonly (number | string)[];
5
+ type SemanticKind = "primitive" | "record" | "array" | "empty-array" | "call" | "special-form" | "invalid-call";
6
+ type SpecialFormName = "begin" | "cond" | "define" | "eval" | "lambda" | "match" | "quote";
7
+ interface SemanticRelationship {
8
+ readonly kind: "definition" | "reference-candidate";
9
+ readonly name: string;
10
+ }
11
+ interface SemanticChild {
12
+ readonly node: SemanticNode;
13
+ readonly order: number;
14
+ readonly role: string;
15
+ }
16
+ interface SemanticNode {
17
+ readonly children: readonly SemanticChild[];
18
+ readonly diagnostic?: string;
19
+ readonly kind: SemanticKind;
20
+ readonly label: string;
21
+ readonly path: StructuralPath;
22
+ readonly pointer: string;
23
+ readonly quoted: boolean;
24
+ readonly relationships: readonly SemanticRelationship[];
25
+ readonly specialForm?: SpecialFormName;
26
+ readonly value?: boolean | null | number | string;
27
+ }
28
+ declare const pathToPointer: (path: StructuralPath) => string;
29
+ declare const isSpecialFormName: (value: unknown) => value is SpecialFormName;
30
+ declare const analyze: (expression: LionExpressionType) => SemanticNode;
31
+ declare const flattenAnalysis: (root: SemanticNode) => readonly SemanticNode[];
32
+ //#endregion
33
+ export { SemanticChild, SemanticKind, SemanticNode, SemanticRelationship, SpecialFormName, StructuralPath, analyze, flattenAnalysis, isSpecialFormName, pathToPointer };
34
+ //# sourceMappingURL=analyze.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.d.mts","names":[],"sources":["../../src/analysis/analyze.ts"],"mappings":";;;KAYY,cAAA;AAAA,KAEA,YAAA;AAAA,KASA,eAAA;AAAA,UASK,oBAAA;EAAA,SACN,IAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGM,aAAA;EAAA,SACN,IAAA,EAAM,YAAA;EAAA,SACN,KAAA;EAAA,SACA,IAAA;AAAA;AAAA,UAGM,YAAA;EAAA,SACN,QAAA,WAAmB,aAAA;EAAA,SACnB,UAAA;EAAA,SACA,IAAA,EAAM,YAAA;EAAA,SACN,KAAA;EAAA,SACA,IAAA,EAAM,cAAA;EAAA,SACN,OAAA;EAAA,SACA,MAAA;EAAA,SACA,aAAA,WAAwB,oBAAA;EAAA,SACxB,WAAA,GAAc,eAAA;EAAA,SACd,KAAA;AAAA;AAAA,cAwEE,aAAA,GAAiB,IAAA,EAAM,cAAA;AAAA,cA4IvB,iBAAA,GAAqB,KAAA,cAAiB,KAAA,IAAS,eAAA;AAAA,cAI/C,OAAA,GAAW,UAAA,EAAY,kBAAA,KAAqB,YAAA;AAAA,cAG5C,eAAA,GACX,IAAA,EAAM,YAAA,cACI,YAAA"}
@@ -0,0 +1,181 @@
1
+ import { BeginFormSchema, CondFormSchema, DefineFormSchema, EvalFormSchema, LambdaFormSchema, MatchFormSchema, QuoteFormSchema } from "../schemas/evaluation.mjs";
2
+ import { Schema } from "effect";
3
+ //#region src/analysis/analyze.ts
4
+ const roleByIndex = (roles, fallback) => (index) => roles[index] ?? fallback;
5
+ const SPECIAL_FORMS = [
6
+ {
7
+ name: "eval",
8
+ matches: Schema.is(EvalFormSchema),
9
+ role: roleByIndex(["operator", "expression"], "argument")
10
+ },
11
+ {
12
+ name: "quote",
13
+ matches: Schema.is(QuoteFormSchema),
14
+ role: roleByIndex(["operator", "quoted-value"], "quoted-value")
15
+ },
16
+ {
17
+ name: "begin",
18
+ matches: Schema.is(BeginFormSchema),
19
+ role: roleByIndex(["operator"], "sequence-item")
20
+ },
21
+ {
22
+ name: "define",
23
+ matches: Schema.is(DefineFormSchema),
24
+ role: roleByIndex([
25
+ "operator",
26
+ "binding",
27
+ "value"
28
+ ], "value")
29
+ },
30
+ {
31
+ name: "lambda",
32
+ matches: Schema.is(LambdaFormSchema),
33
+ role: roleByIndex([
34
+ "operator",
35
+ "parameters",
36
+ "body"
37
+ ], "body")
38
+ },
39
+ {
40
+ name: "cond",
41
+ matches: Schema.is(CondFormSchema),
42
+ role: roleByIndex(["operator"], "branch")
43
+ },
44
+ {
45
+ name: "match",
46
+ matches: Schema.is(MatchFormSchema),
47
+ role: (index, length) => {
48
+ if (index === 0) return "operator";
49
+ if (index === 1) return "subject";
50
+ return index === length - 1 ? "fallback" : "pattern";
51
+ }
52
+ }
53
+ ];
54
+ const SPECIAL_FORM_NAMES = {
55
+ begin: true,
56
+ cond: true,
57
+ define: true,
58
+ eval: true,
59
+ lambda: true,
60
+ match: true,
61
+ quote: true
62
+ };
63
+ const escapePointerSegment = (segment) => String(segment).replaceAll("~", "~0").replaceAll("/", "~1");
64
+ const pathToPointer = (path) => path.length === 0 ? "" : `/${path.map(escapePointerSegment).join("/")}`;
65
+ const primitiveLabel = (value) => {
66
+ if (typeof value === "string") return JSON.stringify(value);
67
+ return String(value);
68
+ };
69
+ const analyzeNode = (expression, path, quoted) => {
70
+ if (!Array.isArray(expression) && (expression === null || typeof expression !== "object")) {
71
+ const relationships = [];
72
+ if (typeof expression === "string") relationships.push({
73
+ kind: "reference-candidate",
74
+ name: expression
75
+ });
76
+ return {
77
+ path,
78
+ pointer: pathToPointer(path),
79
+ kind: "primitive",
80
+ label: primitiveLabel(expression),
81
+ value: expression,
82
+ quoted,
83
+ children: [],
84
+ relationships
85
+ };
86
+ }
87
+ if (!Array.isArray(expression)) {
88
+ const entries = Object.entries(expression);
89
+ return {
90
+ path,
91
+ pointer: pathToPointer(path),
92
+ kind: "record",
93
+ label: entries.length === 0 ? "empty record" : `record · ${entries.length}`,
94
+ quoted,
95
+ children: entries.map(([key, value], order) => ({
96
+ role: key,
97
+ order,
98
+ node: analyzeNode(value, [...path, key], quoted)
99
+ })),
100
+ relationships: []
101
+ };
102
+ }
103
+ if (expression.length === 0) return {
104
+ path,
105
+ pointer: pathToPointer(path),
106
+ kind: "empty-array",
107
+ label: "empty array",
108
+ quoted,
109
+ children: [],
110
+ relationships: []
111
+ };
112
+ const head = expression[0];
113
+ const namedForm = SPECIAL_FORMS.find(({ name }) => name === head);
114
+ const validForm = SPECIAL_FORMS.find(({ matches }) => matches(expression));
115
+ const relationships = [];
116
+ if (!quoted && validForm?.name === "define" && typeof expression[1] === "string") relationships.push({
117
+ kind: "definition",
118
+ name: expression[1]
119
+ });
120
+ const role = quoted ? () => "item" : validForm?.role ?? roleByIndex(["callee"], "argument");
121
+ const children = expression.map((value, order) => ({
122
+ role: role(order, expression.length),
123
+ order,
124
+ node: analyzeNode(value, [...path, order], quoted || validForm?.name === "quote" && order > 0)
125
+ }));
126
+ if (quoted) return {
127
+ path,
128
+ pointer: pathToPointer(path),
129
+ kind: "array",
130
+ label: `array · ${expression.length}`,
131
+ quoted,
132
+ children,
133
+ relationships
134
+ };
135
+ if (!quoted && namedForm && !validForm) return {
136
+ path,
137
+ pointer: pathToPointer(path),
138
+ kind: "invalid-call",
139
+ label: `invalid ${namedForm.name}`,
140
+ specialForm: namedForm.name,
141
+ quoted,
142
+ children,
143
+ relationships,
144
+ diagnostic: `The ${namedForm.name} form has an invalid structure.`
145
+ };
146
+ if (!quoted && validForm) return {
147
+ path,
148
+ pointer: pathToPointer(path),
149
+ kind: "special-form",
150
+ label: validForm.name,
151
+ specialForm: validForm.name,
152
+ quoted,
153
+ children,
154
+ relationships
155
+ };
156
+ const label = typeof head === "string" ? head : "call";
157
+ return {
158
+ path,
159
+ pointer: pathToPointer(path),
160
+ kind: "call",
161
+ label,
162
+ quoted,
163
+ children,
164
+ relationships
165
+ };
166
+ };
167
+ const isSpecialFormName = (value) => typeof value === "string" && Object.hasOwn(SPECIAL_FORM_NAMES, value);
168
+ const analyze = (expression) => analyzeNode(expression, [], false);
169
+ const flattenAnalysis = (root) => {
170
+ const nodes = [];
171
+ const visit = (node) => {
172
+ nodes.push(node);
173
+ for (const child of node.children) visit(child.node);
174
+ };
175
+ visit(root);
176
+ return nodes;
177
+ };
178
+ //#endregion
179
+ export { analyze, flattenAnalysis, isSpecialFormName, pathToPointer };
180
+
181
+ //# sourceMappingURL=analyze.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"analyze.mjs","names":[],"sources":["../../src/analysis/analyze.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport {\n BeginFormSchema,\n CondFormSchema,\n DefineFormSchema,\n EvalFormSchema,\n LambdaFormSchema,\n MatchFormSchema,\n QuoteFormSchema,\n} from \"@/schemas/evaluation\";\nimport type { LionExpressionType } from \"@/schemas/lion-expression\";\n\nexport type StructuralPath = readonly (number | string)[];\n\nexport type SemanticKind =\n | \"primitive\"\n | \"record\"\n | \"array\"\n | \"empty-array\"\n | \"call\"\n | \"special-form\"\n | \"invalid-call\";\n\nexport type SpecialFormName =\n | \"begin\"\n | \"cond\"\n | \"define\"\n | \"eval\"\n | \"lambda\"\n | \"match\"\n | \"quote\";\n\nexport interface SemanticRelationship {\n readonly kind: \"definition\" | \"reference-candidate\";\n readonly name: string;\n}\n\nexport interface SemanticChild {\n readonly node: SemanticNode;\n readonly order: number;\n readonly role: string;\n}\n\nexport interface SemanticNode {\n readonly children: readonly SemanticChild[];\n readonly diagnostic?: string;\n readonly kind: SemanticKind;\n readonly label: string;\n readonly path: StructuralPath;\n readonly pointer: string;\n readonly quoted: boolean;\n readonly relationships: readonly SemanticRelationship[];\n readonly specialForm?: SpecialFormName;\n readonly value?: boolean | null | number | string;\n}\n\ninterface FormDefinition {\n readonly matches: (value: unknown) => boolean;\n readonly name: SpecialFormName;\n readonly role: (index: number, length: number) => string;\n}\n\nconst roleByIndex =\n (roles: readonly string[], fallback: string) => (index: number) =>\n roles[index] ?? fallback;\n\nconst SPECIAL_FORMS: readonly FormDefinition[] = [\n {\n name: \"eval\",\n matches: Schema.is(EvalFormSchema),\n role: roleByIndex([\"operator\", \"expression\"], \"argument\"),\n },\n {\n name: \"quote\",\n matches: Schema.is(QuoteFormSchema),\n role: roleByIndex([\"operator\", \"quoted-value\"], \"quoted-value\"),\n },\n {\n name: \"begin\",\n matches: Schema.is(BeginFormSchema),\n role: roleByIndex([\"operator\"], \"sequence-item\"),\n },\n {\n name: \"define\",\n matches: Schema.is(DefineFormSchema),\n role: roleByIndex([\"operator\", \"binding\", \"value\"], \"value\"),\n },\n {\n name: \"lambda\",\n matches: Schema.is(LambdaFormSchema),\n role: roleByIndex([\"operator\", \"parameters\", \"body\"], \"body\"),\n },\n {\n name: \"cond\",\n matches: Schema.is(CondFormSchema),\n role: roleByIndex([\"operator\"], \"branch\"),\n },\n {\n name: \"match\",\n matches: Schema.is(MatchFormSchema),\n role: (index, length) => {\n if (index === 0) {\n return \"operator\";\n }\n if (index === 1) {\n return \"subject\";\n }\n return index === length - 1 ? \"fallback\" : \"pattern\";\n },\n },\n];\n\nconst SPECIAL_FORM_NAMES: Readonly<Record<SpecialFormName, true>> = {\n begin: true,\n cond: true,\n define: true,\n eval: true,\n lambda: true,\n match: true,\n quote: true,\n};\n\nconst escapePointerSegment = (segment: number | string) =>\n String(segment).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n\nexport const pathToPointer = (path: StructuralPath): string =>\n path.length === 0 ? \"\" : `/${path.map(escapePointerSegment).join(\"/\")}`;\n\nconst primitiveLabel = (value: boolean | null | number | string) => {\n if (typeof value === \"string\") {\n return JSON.stringify(value);\n }\n return String(value);\n};\n\nconst analyzeNode = (\n expression: LionExpressionType,\n path: StructuralPath,\n quoted: boolean\n): SemanticNode => {\n if (\n !Array.isArray(expression) &&\n (expression === null || typeof expression !== \"object\")\n ) {\n const relationships: SemanticRelationship[] = [];\n if (typeof expression === \"string\") {\n relationships.push({ kind: \"reference-candidate\", name: expression });\n }\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"primitive\",\n label: primitiveLabel(expression),\n value: expression,\n quoted,\n children: [],\n relationships,\n };\n }\n\n if (!Array.isArray(expression)) {\n const entries = Object.entries(expression);\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"record\",\n label:\n entries.length === 0 ? \"empty record\" : `record · ${entries.length}`,\n quoted,\n children: entries.map(([key, value], order) => ({\n role: key,\n order,\n node: analyzeNode(value, [...path, key], quoted),\n })),\n relationships: [],\n };\n }\n\n if (expression.length === 0) {\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"empty-array\",\n label: \"empty array\",\n quoted,\n children: [],\n relationships: [],\n };\n }\n\n const head = expression[0];\n const namedForm = SPECIAL_FORMS.find(({ name }) => name === head);\n const validForm = SPECIAL_FORMS.find(({ matches }) => matches(expression));\n const relationships: SemanticRelationship[] = [];\n if (\n !quoted &&\n validForm?.name === \"define\" &&\n typeof expression[1] === \"string\"\n ) {\n relationships.push({ kind: \"definition\", name: expression[1] });\n }\n const role = quoted\n ? () => \"item\"\n : (validForm?.role ?? roleByIndex([\"callee\"], \"argument\"));\n const children = expression.map((value, order) => ({\n role: role(order, expression.length),\n order,\n node: analyzeNode(\n value,\n [...path, order],\n quoted || (validForm?.name === \"quote\" && order > 0)\n ),\n }));\n\n if (quoted) {\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"array\",\n label: `array · ${expression.length}`,\n quoted,\n children,\n relationships,\n };\n }\n\n if (!quoted && namedForm && !validForm) {\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"invalid-call\",\n label: `invalid ${namedForm.name}`,\n specialForm: namedForm.name,\n quoted,\n children,\n relationships,\n diagnostic: `The ${namedForm.name} form has an invalid structure.`,\n };\n }\n\n if (!quoted && validForm) {\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"special-form\",\n label: validForm.name,\n specialForm: validForm.name,\n quoted,\n children,\n relationships,\n };\n }\n\n const label = typeof head === \"string\" ? head : \"call\";\n return {\n path,\n pointer: pathToPointer(path),\n kind: \"call\",\n label,\n quoted,\n children,\n relationships,\n };\n};\n\nexport const isSpecialFormName = (value: unknown): value is SpecialFormName =>\n typeof value === \"string\" &&\n Object.hasOwn(SPECIAL_FORM_NAMES, value as SpecialFormName);\n\nexport const analyze = (expression: LionExpressionType): SemanticNode =>\n analyzeNode(expression, [], false);\n\nexport const flattenAnalysis = (\n root: SemanticNode\n): readonly SemanticNode[] => {\n const nodes: SemanticNode[] = [];\n const visit = (node: SemanticNode) => {\n nodes.push(node);\n for (const child of node.children) {\n visit(child.node);\n }\n };\n visit(root);\n return nodes;\n};\n"],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import { Ref, Schema } from "effect";
2
+
3
+ //#region src/schemas/environment.d.ts
4
+ type BindingsRef = Ref.Ref<Record<string, unknown>>;
5
+ interface InnerEnvironment {
6
+ readonly bindingsRef: BindingsRef;
7
+ readonly parent: Environment;
8
+ }
9
+ type Environment = typeof EnvironmentSchema.Type;
10
+ type ToplevelEnvironment = typeof ToplevelEnvironmentSchema.Type;
11
+ declare const ToplevelEnvironmentSchema: Schema.Struct<{
12
+ readonly bindingsRef: Schema.Codec<BindingsRef, BindingsRef, never, never>;
13
+ }>;
14
+ declare const EnvironmentSchema: Schema.Union<readonly [Schema.Struct<{
15
+ readonly bindingsRef: Schema.Codec<BindingsRef, BindingsRef, never, never>;
16
+ }>, Schema.suspend<Schema.Codec<InnerEnvironment, InnerEnvironment, never, never>>]>;
17
+ declare const InnerEnvironmentSchema: Schema.Struct<{
18
+ readonly bindingsRef: Schema.Codec<BindingsRef, BindingsRef, never, never>;
19
+ readonly parent: Schema.Union<readonly [Schema.Struct<{
20
+ readonly bindingsRef: Schema.Codec<BindingsRef, BindingsRef, never, never>;
21
+ }>, Schema.suspend<Schema.Codec<InnerEnvironment, InnerEnvironment, never, never>>]>;
22
+ }>;
23
+ //#endregion
24
+ export { ToplevelEnvironment as a, InnerEnvironmentSchema as i, EnvironmentSchema as n, ToplevelEnvironmentSchema as o, InnerEnvironment as r, Environment as t };
25
+ //# sourceMappingURL=environment-BQw8BPXl.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"environment-k2Uf6VVc.d.mts","names":[],"sources":["../src/schemas/environment.ts"],"mappings":";;;KAEK,WAAA,GAAc,GAAA,CAAI,GAAA,CAAI,MAAA;AAAA,UAQV,gBAAA;EAAA,SACN,WAAA,EAAa,WAAA;EAAA,SACb,MAAA,EAAQ,WAAA;AAAA;AAAA,KAGP,WAAA,UAAqB,iBAAA,CAAkB,IAAA;AAAA,KAEvC,mBAAA,UAA6B,yBAAA,CAA0B,IAAA;AAAA,cAEtD,yBAAA,EAAyB,MAAA,CAAA,MAAA;;;cAIzB,iBAAA,EAAiB,MAAA,CAAA,KAAA,EAAA,MAAA,CAAA,MAAA;;;cAKjB,sBAAA,EAAsB,MAAA,CAAA,MAAA"}
1
+ {"version":3,"file":"environment-BQw8BPXl.d.mts","names":[],"sources":["../src/schemas/environment.ts"],"mappings":";;;KAEK,WAAA,GAAc,GAAA,CAAI,GAAA,CAAI,MAAA;AAAA,UAQV,gBAAA;EAAA,SACN,WAAA,EAAa,WAAA;EAAA,SACb,MAAA,EAAQ,WAAA;AAAA;AAAA,KAGP,WAAA,UAAqB,iBAAA,CAAkB,IAAA;AAAA,KAEvC,mBAAA,UAA6B,yBAAA,CAA0B,IAAA;AAAA,cAEtD,yBAAA,EAAyB,MAAA,CAAA,MAAA;EAAA;;cAIzB,iBAAA,EAAiB,MAAA,CAAA,KAAA,WAAA,MAAA,CAAA,MAAA;EAAA;;cAKjB,sBAAA,EAAsB,MAAA,CAAA,MAAA;EAAA"}
@@ -1,2 +1,2 @@
1
- import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../evaluation-AblffSQw.mjs";
1
+ import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../evaluation-B6K0DbPS.mjs";
2
2
  export { ArgumentMismatchError, InvalidFunctionCallError };
@@ -1,8 +1,8 @@
1
1
  import { LionExpressionSchema } from "../schemas/lion-expression.mjs";
2
2
  import { Schema } from "effect";
3
3
  //#region src/errors/evaluation.ts
4
- var ArgumentMismatchError = class extends Schema.TaggedError("ArgumentMismatchError")("ArgumentMismatchError", {}) {};
5
- var InvalidFunctionCallError = class extends Schema.TaggedError("InvalidFunctionCallError")("InvalidFunctionCallError", { expression: LionExpressionSchema }) {};
4
+ var ArgumentMismatchError = class extends Schema.TaggedError()("ArgumentMismatchError", {}) {};
5
+ var InvalidFunctionCallError = class extends Schema.TaggedError()("InvalidFunctionCallError", { expression: LionExpressionSchema }) {};
6
6
  //#endregion
7
7
  export { ArgumentMismatchError, InvalidFunctionCallError };
8
8
 
@@ -1 +1 @@
1
- {"version":3,"file":"evaluation.mjs","names":[],"sources":["../../src/errors/evaluation.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport { LionExpressionSchema } from \"@/schemas/lion-expression\";\n\nexport class ArgumentMismatchError extends Schema.TaggedError<ArgumentMismatchError>(\n \"ArgumentMismatchError\"\n)(\"ArgumentMismatchError\", {}) {}\n\nexport class InvalidFunctionCallError extends Schema.TaggedError<InvalidFunctionCallError>(\n \"InvalidFunctionCallError\"\n)(\"InvalidFunctionCallError\", { expression: LionExpressionSchema }) {}\n"],"mappings":";;;AAGA,IAAa,wBAAb,cAA2C,OAAO,YAChD,wBACD,CAAC,yBAAyB,EAAE,CAAC,CAAC;AAE/B,IAAa,2BAAb,cAA8C,OAAO,YACnD,2BACD,CAAC,4BAA4B,EAAE,YAAY,sBAAsB,CAAC,CAAC"}
1
+ {"version":3,"file":"evaluation.mjs","names":[],"sources":["../../src/errors/evaluation.ts"],"sourcesContent":["import { Schema } from \"effect\";\nimport { LionExpressionSchema } from \"@/schemas/lion-expression\";\n\nexport class ArgumentMismatchError extends Schema.TaggedError<ArgumentMismatchError>()(\n \"ArgumentMismatchError\",\n {}\n) {}\n\nexport class InvalidFunctionCallError extends Schema.TaggedError<InvalidFunctionCallError>()(\n \"InvalidFunctionCallError\",\n { expression: LionExpressionSchema }\n) {}\n"],"mappings":";;;AAGA,IAAa,wBAAb,cAA2C,OAAO,aAAoC,CACpF,yBACA,EAAE,CACH,CAAC;AAEF,IAAa,2BAAb,cAA8C,OAAO,aAAuC,CAC1F,4BACA,EAAE,YAAY,sBAAsB,CACrC,CAAC"}
@@ -1,9 +1,8 @@
1
- import { JsonPrimitiveSchema } from "./schemas/json-primitive.mjs";
2
1
  import { LionArrayExpressionSchema, LionExpressionSchema, LionRecordExpressionSchema } from "./schemas/lion-expression.mjs";
2
+ import { BeginFormSchema, CondFormSchema, CondFormWithElseSchema, CondFormWithoutElseSchema, DefineFormSchema, EvalFormSchema, FunctionCallFormSchema, LambdaFormSchema, LionFunctionValueSchema, MatchFormSchema, MatchPatternSchema, QuoteFormSchema } from "./schemas/evaluation.mjs";
3
3
  import { ArgumentMismatchError, InvalidFunctionCallError } from "./errors/evaluation.mjs";
4
4
  import { makeEnvironment, setGlobalBinding } from "./evaluation/environment.mjs";
5
- import { BeginFormSchema, CondFormSchema, CondFormWithElseSchema, CondFormWithoutElseSchema, DefineFormSchema, EvalFormSchema, FunctionCallFormSchema, LambdaFormSchema, LionFunctionValueSchema, MatchFormSchema, MatchPatternSchema, QuoteFormSchema } from "./schemas/evaluation.mjs";
6
- import { LionEnvironmentService, getService } from "./services/evaluation.mjs";
5
+ import { LionEnvironmentService } from "./services/evaluation.mjs";
7
6
  import { evaluateQuote } from "./evaluation/special-forms/quote.mjs";
8
7
  import { evaluatePrimitive } from "./evaluation/base-forms/primitive.mjs";
9
8
  import { Array, Effect, Match, Option, Record, Schema, pipe } from "effect";
@@ -22,10 +21,10 @@ const evaluateCond = (expression) => pipe(Match.value(expression), Match.when(Sc
22
21
  })), Match.exhaustive);
23
22
  //#endregion
24
23
  //#region src/evaluation/special-forms/define.ts
25
- const evaluateDefine = ([_, id, expr]) => pipe(Effect.Do, Effect.bind("environment", () => getService(LionEnvironmentService)), Effect.bind("value", () => evaluate(expr)), Effect.flatMap(({ environment, value }) => pipe(setGlobalBinding(environment, id, value), Effect.map(() => value))));
24
+ const evaluateDefine = ([_, id, expr]) => pipe(Effect.Do, Effect.bind("environment", () => Effect.service(LionEnvironmentService)), Effect.bind("value", () => evaluate(expr)), Effect.flatMap(({ environment, value }) => pipe(setGlobalBinding(environment, id, value), Effect.map(() => value))));
26
25
  //#endregion
27
26
  //#region src/evaluation/special-forms/eval.ts
28
- const evaluateEval = ([_, args]) => pipe(evaluate(args), Effect.flatMap(Schema.decodeUnknown(LionExpressionSchema)), Effect.flatMap(evaluate));
27
+ const evaluateEval = ([_, args]) => pipe(evaluate(args), Effect.flatMap(Schema.decodeUnknownEffect(LionExpressionSchema)), Effect.flatMap(evaluate));
29
28
  //#endregion
30
29
  //#region src/evaluation/special-forms/function.ts
31
30
  const evaluateFunctionCall = (functionCallExpression) => pipe(Effect.all(Array.map(functionCallExpression, evaluate)), Effect.map(Array.unprepend), Effect.flatMap(([head, tail]) => pipe(Match.value(head), Match.when(Schema.is(LionFunctionValueSchema), (fn) => {
@@ -35,7 +34,7 @@ const evaluateFunctionCall = (functionCallExpression) => pipe(Effect.all(Array.m
35
34
  //#endregion
36
35
  //#region src/evaluation/special-forms/lambda.ts
37
36
  const evaluateLambda = ([_, parameters, bodyExpression]) => Effect.gen(function* () {
38
- const enclosedEnvironment = yield* getService(LionEnvironmentService);
37
+ const enclosedEnvironment = yield* LionEnvironmentService;
39
38
  return Effect.fn(function* (...args) {
40
39
  if (args.length < parameters.length) return yield* new ArgumentMismatchError();
41
40
  const environment = yield* makeEnvironment(Record.fromEntries(Array.zip(parameters, args)), enclosedEnvironment);
@@ -44,41 +43,45 @@ const evaluateLambda = ([_, parameters, bodyExpression]) => Effect.gen(function*
44
43
  });
45
44
  //#endregion
46
45
  //#region src/evaluation/special-forms/match.ts
47
- const MatchPredicateRecordSchema = Schema.Record({
48
- key: Schema.String,
49
- value: Schema.suspend(() => MatchPredicateSchema)
50
- });
51
- const MatchPredicateSchema = Schema.Union(MatchPredicateRecordSchema, LionFunctionValueSchema);
52
- const AnyRecordSchema = Schema.Record({
53
- key: Schema.String,
54
- value: Schema.Any
55
- });
56
- const evaluatePredicate = (value, predicate) => pipe(Match.value(predicate), Match.when(Schema.is(MatchPredicateRecordSchema), (record) => Effect.gen(function* () {
57
- if (!Schema.is(AnyRecordSchema)(value)) return false;
58
- if (!Record.keys(record).every((key) => Record.has(value, key))) return false;
59
- let result = true;
60
- for (const [recordKey, recordValue] of Record.toEntries(record)) {
61
- const recordValueResult = yield* evaluatePredicate(value[recordKey], recordValue);
62
- result = result && recordValueResult;
46
+ const MatchPredicateRecordSchema = Schema.Record(Schema.String, Schema.suspend(() => MatchPredicateSchema));
47
+ const MatchPredicateSchema = Schema.Union([MatchPredicateRecordSchema, LionFunctionValueSchema]);
48
+ const AnyRecordSchema = Schema.Record(Schema.String, Schema.Any);
49
+ const evaluatePredicate = (value, predicate) => {
50
+ if (Schema.is(MatchPredicateRecordSchema)(predicate)) return Effect.gen(function* () {
51
+ if (!Schema.is(AnyRecordSchema)(value)) return false;
52
+ if (!Record.keys(predicate).every((key) => Record.has(value, key))) return false;
53
+ for (const [key, nestedPredicate] of Record.toEntries(predicate)) if (!(yield* evaluatePredicate(value[key], nestedPredicate))) return false;
54
+ return true;
55
+ });
56
+ return predicate(value).pipe(Effect.flatMap(Schema.decodeUnknownEffect(Schema.Boolean)), Effect.catch(() => Effect.succeed(false)));
57
+ };
58
+ const evaluateMatchPatterns = (value, patternExprs) => Effect.gen(function* () {
59
+ const patternExpr = patternExprs[0];
60
+ if (patternExpr === void 0) return yield* Effect.die(/* @__PURE__ */ new Error("Match expression requires a fallback function"));
61
+ if (Schema.is(MatchPatternSchema)(patternExpr)) {
62
+ const [predicateExpr, functionExpr] = patternExpr;
63
+ const predicate = yield* evaluate(predicateExpr).pipe(Effect.flatMap(Schema.decodeUnknownEffect(MatchPredicateSchema)));
64
+ const fn = yield* evaluate(functionExpr).pipe(Effect.flatMap(Schema.decodeUnknownEffect(LionFunctionValueSchema)));
65
+ return (yield* evaluatePredicate(value, predicate)) ? yield* fn(value) : yield* evaluateMatchPatterns(value, patternExprs.slice(1));
63
66
  }
64
- return result;
65
- })), Match.when(Schema.is(LionFunctionValueSchema), (predicateFn) => pipe(predicateFn(value), Effect.flatMap(Schema.decodeUnknown(Schema.Boolean)), Effect.catchAll(() => Effect.succeed(false)))), Match.orElseAbsurd);
66
- const evaluateMatchPatterns = (value, patternExprs) => pipe(Array.head(patternExprs), Option.getOrThrow, Match.value, Match.when(Schema.is(MatchPatternSchema), ([predicateExpr, fnExpr]) => pipe(Effect.Do, Effect.bind("predicate", () => evaluate(predicateExpr)), Effect.bind("fn", () => pipe(evaluate(fnExpr), Effect.flatMap(Schema.decodeUnknown(LionFunctionValueSchema)))), Effect.flatMap(({ predicate, fn }) => pipe(Schema.decodeUnknown(MatchPredicateSchema)(predicate), Effect.flatMap((predicate) => evaluatePredicate(value, predicate)), Effect.if({
67
- onTrue: () => fn(value),
68
- onFalse: () => pipe(Array.tail(patternExprs), Option.getOrThrow, (tail) => evaluateMatchPatterns(value, tail))
69
- }))))), Match.when(Schema.is(LionExpressionSchema), (fallbackFn) => pipe(evaluate(fallbackFn), Effect.flatMap(Schema.decodeUnknown(LionFunctionValueSchema)), Effect.flatMap((fallbackFn) => fallbackFn(value)))), Match.exhaustive);
70
- const evaluateMatch = ([_, valueExpr, ...patternExprs]) => pipe(evaluate(valueExpr), Effect.flatMap((value) => evaluateMatchPatterns(value, patternExprs)));
67
+ return yield* (yield* evaluate(patternExpr).pipe(Effect.flatMap(Schema.decodeUnknownEffect(LionFunctionValueSchema))))(value);
68
+ });
69
+ const evaluateMatch = ([_, valueExpression, ...patternExpressions]) => evaluate(valueExpression).pipe(Effect.flatMap((value) => evaluateMatchPatterns(value, patternExpressions)));
71
70
  //#endregion
72
71
  //#region src/evaluation/base-forms/array.ts
73
- const evaluateArray = (expression) => pipe(Match.value(expression), Match.when(Array.isEmptyReadonlyArray, Effect.succeed), Match.when(Schema.is(EvalFormSchema), (_) => evaluateEval(_)), Match.when(Schema.is(QuoteFormSchema), (_) => evaluateQuote(_)), Match.when(Schema.is(BeginFormSchema), (_) => evaluateBegin(_)), Match.when(Schema.is(DefineFormSchema), (_) => evaluateDefine(_)), Match.when(Schema.is(LambdaFormSchema), (_) => evaluateLambda(_)), Match.when(Schema.is(CondFormSchema), (_) => evaluateCond(_)), Match.when(Schema.is(MatchFormSchema), (_) => evaluateMatch(_)), Match.when(Schema.is(FunctionCallFormSchema), (_) => evaluateFunctionCall(_)), Match.orElse(() => Effect.fail(new InvalidFunctionCallError({ expression }))));
72
+ const evaluateArray = (expression) => pipe(Match.value(expression), Match.when(Array.isReadonlyArrayEmpty, Effect.succeed), Match.when(Schema.is(EvalFormSchema), (_) => evaluateEval(_)), Match.when(Schema.is(QuoteFormSchema), (_) => evaluateQuote(_)), Match.when(Schema.is(BeginFormSchema), (_) => evaluateBegin(_)), Match.when(Schema.is(DefineFormSchema), (_) => evaluateDefine(_)), Match.when(Schema.is(LambdaFormSchema), (_) => evaluateLambda(_)), Match.when(Schema.is(CondFormSchema), (_) => evaluateCond(_)), Match.when(Schema.is(MatchFormSchema), (_) => evaluateMatch(_)), Match.when(Schema.is(FunctionCallFormSchema), (_) => evaluateFunctionCall(_)), Match.orElse(() => Effect.fail(new InvalidFunctionCallError({ expression }))));
74
73
  //#endregion
75
74
  //#region src/evaluation/base-forms/record.ts
76
75
  const evaluateRecord = (expression) => pipe(expression, Record.map(evaluate), Effect.all);
77
76
  //#endregion
78
77
  //#region src/evaluation/evaluate.ts
79
- const evaluate = (expression) => pipe(Match.value(expression), Match.when(Schema.is(LionArrayExpressionSchema), (_) => evaluateArray(_)), Match.when(Schema.is(LionRecordExpressionSchema), (_) => evaluateRecord(_)), Match.when(Schema.is(JsonPrimitiveSchema), (_) => evaluatePrimitive(_)), Match.exhaustive);
80
- const run = (expression, environment) => pipe(Schema.decodeUnknown(LionExpressionSchema)(expression), Effect.flatMap(evaluate), Effect.provideServiceEffect(LionEnvironmentService, makeEnvironment(environment)));
78
+ const evaluate = (expression) => {
79
+ if (Schema.is(LionArrayExpressionSchema)(expression)) return evaluateArray(expression);
80
+ if (Schema.is(LionRecordExpressionSchema)(expression)) return evaluateRecord(expression);
81
+ return evaluatePrimitive(expression);
82
+ };
83
+ const run = (expression, environment) => pipe(Schema.decodeUnknownEffect(LionExpressionSchema)(expression), Effect.flatMap(evaluate), Effect.provideServiceEffect(LionEnvironmentService, makeEnvironment(environment)));
81
84
  //#endregion
82
85
  export { evaluateMatch as a, evaluateEval as c, evaluateBegin as d, evaluateArray as i, evaluateDefine as l, run as n, evaluateLambda as o, evaluateRecord as r, evaluateFunctionCall as s, evaluate as t, evaluateCond as u };
83
86
 
84
- //# sourceMappingURL=evaluate-D7ODMrbg.mjs.map
87
+ //# sourceMappingURL=evaluate-BJOG7kaS.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evaluate-BJOG7kaS.mjs","names":["Arr","Arr","Arr","Arr","Arr"],"sources":["../src/evaluation/special-forms/begin.ts","../src/evaluation/special-forms/cond.ts","../src/evaluation/special-forms/define.ts","../src/evaluation/special-forms/eval.ts","../src/evaluation/special-forms/function.ts","../src/evaluation/special-forms/lambda.ts","../src/evaluation/special-forms/match.ts","../src/evaluation/base-forms/array.ts","../src/evaluation/base-forms/record.ts","../src/evaluation/evaluate.ts"],"sourcesContent":["import { Array as Arr, Effect, Option, pipe } from \"effect\";\nimport { evaluate } from \"@/evaluation/evaluate\";\nimport type { BeginFormSchema } from \"@/schemas/evaluation\";\n\nexport const evaluateBegin = ([_, ...args]: typeof BeginFormSchema.Type) =>\n pipe(\n Arr.map(args, evaluate),\n Effect.all,\n Effect.map(Arr.last),\n Effect.map(Option.getOrElse(() => []))\n );\n","import { Array as Arr, Effect, Match, pipe, Schema } from \"effect\";\nimport { evaluate } from \"@/evaluation/evaluate\";\nimport {\n type CondFormSchema,\n CondFormWithElseSchema,\n CondFormWithoutElseSchema,\n} from \"@/schemas/evaluation\";\n\nexport const evaluateCond = (expression: typeof CondFormSchema.Type) =>\n pipe(\n Match.value(expression),\n Match.when(Schema.is(CondFormWithoutElseSchema), (exprWithoutElse) =>\n Effect.gen(function* () {\n const [_, ...cases] = exprWithoutElse;\n for (const [condition, result] of cases) {\n const conditionResult = yield* evaluate(condition);\n if (conditionResult) {\n return yield* evaluate(result);\n }\n }\n return null;\n })\n ),\n Match.when(Schema.is(CondFormWithElseSchema), (expression) =>\n Effect.gen(function* () {\n const [_, ...cases] = expression;\n for (const [condition, result] of Arr.initNonEmpty(cases)) {\n const conditionResult = yield* evaluate(condition);\n if (conditionResult) {\n return yield* evaluate(result);\n }\n }\n const elseCase = Arr.lastNonEmpty(cases);\n return yield* evaluate(elseCase);\n })\n ),\n Match.exhaustive\n );\n","import { Effect, pipe } from \"effect\";\nimport { setGlobalBinding } from \"@/evaluation/environment\";\nimport { evaluate } from \"@/evaluation/evaluate\";\nimport type { DefineFormSchema } from \"@/schemas/evaluation\";\nimport { LionEnvironmentService } from \"@/services/evaluation\";\n\nexport const evaluateDefine = ([_, id, expr]: typeof DefineFormSchema.Type) =>\n pipe(\n Effect.Do,\n Effect.bind(\"environment\", () => Effect.service(LionEnvironmentService)),\n Effect.bind(\"value\", () => evaluate(expr)),\n Effect.flatMap(({ environment, value }) =>\n pipe(\n setGlobalBinding(environment, id, value),\n Effect.map(() => value)\n )\n )\n );\n","import { Effect, pipe, Schema } from \"effect\";\nimport { evaluate } from \"@/evaluation/evaluate.ts\";\nimport type { EvalFormSchema } from \"@/schemas/evaluation\";\nimport { LionExpressionSchema } from \"@/schemas/lion-expression\";\n\nexport const evaluateEval = ([_, args]: typeof EvalFormSchema.Type) =>\n pipe(\n evaluate(args),\n Effect.flatMap(Schema.decodeUnknownEffect(LionExpressionSchema)),\n Effect.flatMap(evaluate)\n );\n","import { Array as Arr, Effect, Match, pipe, Schema } from \"effect\";\nimport { InvalidFunctionCallError } from \"@/errors/evaluation\";\nimport { evaluate } from \"@/evaluation/evaluate.ts\";\nimport {\n type FunctionCallFormSchema,\n LionFunctionValueSchema,\n} from \"@/schemas/evaluation\";\n\nexport const evaluateFunctionCall = (\n functionCallExpression: typeof FunctionCallFormSchema.Type\n) =>\n pipe(\n Effect.all(Arr.map(functionCallExpression, evaluate)),\n Effect.map(Arr.unprepend),\n Effect.flatMap(([head, tail]) =>\n pipe(\n Match.value(head),\n Match.when(Schema.is(LionFunctionValueSchema), (fn) => {\n const result = fn(...tail);\n return Effect.isEffect(result) ? result : Effect.succeed(result);\n }),\n Match.orElse(() =>\n Effect.fail(\n new InvalidFunctionCallError({ expression: functionCallExpression })\n )\n )\n )\n )\n );\n","import { Array as Arr, Effect, Record } from \"effect\";\nimport { ArgumentMismatchError } from \"@/errors/evaluation\";\nimport { makeEnvironment } from \"@/evaluation/environment\";\nimport { evaluate } from \"@/evaluation/evaluate\";\nimport type { LambdaFormSchema } from \"@/schemas/evaluation\";\nimport { LionEnvironmentService } from \"@/services/evaluation\";\n\nexport const evaluateLambda = ([\n _,\n parameters,\n bodyExpression,\n]: typeof LambdaFormSchema.Type) =>\n Effect.gen(function* () {\n const enclosedEnvironment = yield* LionEnvironmentService;\n const lambda = Effect.fn(function* (...args: unknown[]) {\n if (args.length < parameters.length) {\n return yield* new ArgumentMismatchError();\n }\n const paramsEnvironment = Record.fromEntries(Arr.zip(parameters, args));\n const environment = yield* makeEnvironment(\n paramsEnvironment,\n enclosedEnvironment\n );\n return yield* evaluate(bodyExpression).pipe(\n Effect.provideService(LionEnvironmentService, environment)\n );\n });\n return lambda;\n });\n","import { Effect, Record, Schema } from \"effect\";\nimport { evaluate } from \"@/evaluation/evaluate\";\nimport {\n LionFunctionValueSchema,\n type MatchFormSchema,\n MatchPatternSchema,\n} from \"@/schemas/evaluation\";\nimport type { LionExpressionSchema } from \"@/schemas/lion-expression\";\nimport type { LionEnvironmentService } from \"@/services/evaluation\";\nimport type { EvaluateResult } from \"@/types/evaluation\";\n\n/*\n[\"match\", <value>, [<predicate>, <fn>], ..., <fallback-fn>]\n*/\n\ntype AssumedMatchPredicateType =\n | { readonly [key: string]: AssumedMatchPredicateType }\n | typeof LionFunctionValueSchema.Type;\n\nconst MatchPredicateRecordSchema = Schema.Record(\n Schema.String,\n Schema.suspend(\n (): Schema.Codec<AssumedMatchPredicateType> => MatchPredicateSchema\n )\n);\n\nconst MatchPredicateSchema = Schema.Union([\n MatchPredicateRecordSchema,\n LionFunctionValueSchema,\n]);\n\nconst AnyRecordSchema = Schema.Record(Schema.String, Schema.Any);\n\nconst evaluatePredicate = (\n value: unknown,\n predicate: typeof MatchPredicateSchema.Type\n): Effect.Effect<boolean, never, LionEnvironmentService> => {\n if (Schema.is(MatchPredicateRecordSchema)(predicate)) {\n return Effect.gen(function* () {\n if (!Schema.is(AnyRecordSchema)(value)) {\n return false;\n }\n\n if (!Record.keys(predicate).every((key) => Record.has(value, key))) {\n return false;\n }\n\n for (const [key, nestedPredicate] of Record.toEntries(predicate)) {\n if (!(yield* evaluatePredicate(value[key], nestedPredicate))) {\n return false;\n }\n }\n return true;\n });\n }\n\n return predicate(value).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(Schema.Boolean)),\n Effect.catch(() => Effect.succeed(false))\n );\n};\n\nconst evaluateMatchPatterns = (\n value: unknown,\n patternExprs: ReadonlyArray<\n typeof MatchPatternSchema.Type | typeof LionExpressionSchema.Type\n >\n): EvaluateResult =>\n Effect.gen(function* () {\n const patternExpr = patternExprs[0];\n if (patternExpr === undefined) {\n return yield* Effect.die(\n new Error(\"Match expression requires a fallback function\")\n );\n }\n\n if (Schema.is(MatchPatternSchema)(patternExpr)) {\n const [predicateExpr, functionExpr] = patternExpr;\n const predicate = yield* evaluate(predicateExpr).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(MatchPredicateSchema))\n );\n const fn = yield* evaluate(functionExpr).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(LionFunctionValueSchema))\n );\n return (yield* evaluatePredicate(value, predicate))\n ? yield* fn(value)\n : yield* evaluateMatchPatterns(value, patternExprs.slice(1));\n }\n\n const fallback = yield* evaluate(patternExpr).pipe(\n Effect.flatMap(Schema.decodeUnknownEffect(LionFunctionValueSchema))\n );\n return yield* fallback(value);\n });\n\nexport const evaluateMatch = ([\n _,\n valueExpression,\n ...patternExpressions\n]: typeof MatchFormSchema.Type) =>\n evaluate(valueExpression).pipe(\n Effect.flatMap((value) => evaluateMatchPatterns(value, patternExpressions))\n );\n","import { Array as Arr, Effect, Match, pipe, Schema } from \"effect\";\nimport { InvalidFunctionCallError } from \"@/errors/evaluation\";\nimport { evaluateBegin } from \"@/evaluation/special-forms/begin.ts\";\nimport { evaluateCond } from \"@/evaluation/special-forms/cond.ts\";\nimport { evaluateDefine } from \"@/evaluation/special-forms/define.ts\";\nimport { evaluateEval } from \"@/evaluation/special-forms/eval.ts\";\nimport { evaluateFunctionCall } from \"@/evaluation/special-forms/function.ts\";\nimport { evaluateLambda } from \"@/evaluation/special-forms/lambda\";\nimport { evaluateMatch } from \"@/evaluation/special-forms/match\";\nimport { evaluateQuote } from \"@/evaluation/special-forms/quote.ts\";\nimport {\n BeginFormSchema,\n CondFormSchema,\n DefineFormSchema,\n EvalFormSchema,\n FunctionCallFormSchema,\n LambdaFormSchema,\n MatchFormSchema,\n QuoteFormSchema,\n} from \"@/schemas/evaluation.ts\";\nimport type { LionArrayExpressionType } from \"@/schemas/lion-expression.ts\";\n\nexport const evaluateArray = (expression: LionArrayExpressionType) =>\n pipe(\n Match.value(expression),\n Match.when(Arr.isReadonlyArrayEmpty, Effect.succeed),\n Match.when(Schema.is(EvalFormSchema), (_) => evaluateEval(_)),\n Match.when(Schema.is(QuoteFormSchema), (_) => evaluateQuote(_)),\n Match.when(Schema.is(BeginFormSchema), (_) => evaluateBegin(_)),\n Match.when(Schema.is(DefineFormSchema), (_) => evaluateDefine(_)),\n Match.when(Schema.is(LambdaFormSchema), (_) => evaluateLambda(_)),\n Match.when(Schema.is(CondFormSchema), (_) => evaluateCond(_)),\n Match.when(Schema.is(MatchFormSchema), (_) => evaluateMatch(_)),\n Match.when(Schema.is(FunctionCallFormSchema), (_) =>\n evaluateFunctionCall(_)\n ),\n Match.orElse(() =>\n Effect.fail(new InvalidFunctionCallError({ expression }))\n )\n );\n","import { Effect, pipe, Record } from \"effect\";\nimport { evaluate } from \"@/evaluation/evaluate.ts\";\nimport type { LionRecordExpressionType } from \"@/schemas/lion-expression\";\n\nexport const evaluateRecord = (expression: LionRecordExpressionType) =>\n pipe(expression, Record.map(evaluate), Effect.all);\n","import { Effect, pipe, Schema } from \"effect\";\nimport { evaluateArray } from \"@/evaluation/base-forms/array\";\nimport { evaluatePrimitive } from \"@/evaluation/base-forms/primitive\";\nimport { evaluateRecord } from \"@/evaluation/base-forms/record\";\nimport { makeEnvironment } from \"@/evaluation/environment\";\nimport {\n LionArrayExpressionSchema,\n LionExpressionSchema,\n type LionExpressionType,\n LionRecordExpressionSchema,\n} from \"@/schemas/lion-expression\";\nimport { LionEnvironmentService } from \"@/services/evaluation\";\nimport type { EvaluateResult } from \"@/types/evaluation\";\n\nexport const evaluate = (expression: LionExpressionType): EvaluateResult => {\n if (Schema.is(LionArrayExpressionSchema)(expression)) {\n return evaluateArray(expression);\n }\n if (Schema.is(LionRecordExpressionSchema)(expression)) {\n return evaluateRecord(expression);\n }\n return evaluatePrimitive(expression);\n};\n\nexport const run = (\n expression: unknown,\n environment: Record<string, unknown>\n) =>\n pipe(\n Schema.decodeUnknownEffect(LionExpressionSchema)(expression),\n Effect.flatMap(evaluate),\n Effect.provideServiceEffect(\n LionEnvironmentService,\n makeEnvironment(environment)\n )\n );\n"],"mappings":"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"}
@@ -1,11 +1,10 @@
1
- import { r as LionArrayExpressionType } from "../../lion-expression-6Y3itx9l.mjs";
2
- import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../../evaluation-AblffSQw.mjs";
3
- import { t as LionEnvironmentService } from "../../evaluation-EqzK8tQV.mjs";
4
- import { Effect } from "effect";
5
- import * as _$effect_ParseResult0 from "effect/ParseResult";
1
+ import { r as LionArrayExpressionType } from "../../lion-expression-DMR7Psmu.mjs";
2
+ import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../../evaluation-B6K0DbPS.mjs";
3
+ import { t as LionEnvironmentService } from "../../evaluation-Bs36vy1h.mjs";
4
+ import { Effect, Schema } from "effect";
6
5
 
7
6
  //#region src/evaluation/base-forms/array.d.ts
8
- declare const evaluateArray: (expression: LionArrayExpressionType) => Effect.Effect<unknown, ArgumentMismatchError | InvalidFunctionCallError | _$effect_ParseResult0.ParseError, LionEnvironmentService>;
7
+ declare const evaluateArray: (expression: LionArrayExpressionType) => Effect.Effect<unknown, Schema.SchemaError | ArgumentMismatchError | InvalidFunctionCallError, LionEnvironmentService>;
9
8
  //#endregion
10
9
  export { evaluateArray };
11
10
  //# sourceMappingURL=array.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"array.d.mts","names":[],"sources":["../../../src/evaluation/base-forms/array.ts"],"mappings":";;;;;;;cAsBa,aAAA,GAAiB,UAAA,EAAY,uBAAA,KAAuB,MAAA,CAAA,MAAA,UAAA,qBAAA,GAAA,wBAAA,GAAA,qBAAA,CAAA,UAAA,EAAA,sBAAA"}
1
+ {"version":3,"file":"array.d.mts","names":[],"sources":["../../../src/evaluation/base-forms/array.ts"],"mappings":";;;;;;cAsBa,aAAA,GAAiB,UAAA,EAAY,uBAAA,KAAuB,MAAA,CAAA,MAAA,UAAA,MAAA,CAAA,WAAA,GAAA,qBAAA,GAAA,wBAAA,EAAA,sBAAA"}
@@ -1,2 +1,2 @@
1
- import { i as evaluateArray } from "../../evaluate-D7ODMrbg.mjs";
1
+ import { i as evaluateArray } from "../../evaluate-BJOG7kaS.mjs";
2
2
  export { evaluateArray };
@@ -1,5 +1,5 @@
1
- import { n as JsonPrimitiveType } from "../../json-primitive-DUaaoNff.mjs";
2
- import { t as LionEnvironmentService } from "../../evaluation-EqzK8tQV.mjs";
1
+ import { n as JsonPrimitiveType } from "../../json-primitive-gcv9Q1E4.mjs";
2
+ import { t as LionEnvironmentService } from "../../evaluation-Bs36vy1h.mjs";
3
3
  import { Effect } from "effect";
4
4
 
5
5
  //#region src/evaluation/base-forms/primitive.d.ts
@@ -1,9 +1,9 @@
1
1
  import { getBinding } from "../environment.mjs";
2
- import { LionEnvironmentService, getService } from "../../services/evaluation.mjs";
2
+ import { LionEnvironmentService } from "../../services/evaluation.mjs";
3
3
  import { Effect, Match, Option, String, pipe } from "effect";
4
4
  //#region src/evaluation/base-forms/primitive.ts
5
5
  const evaluatePrimitive = (expression) => pipe(Match.value(expression), Match.when(String.isString, evaluateReference), Match.orElse(Effect.succeed));
6
- const evaluateReference = (name) => pipe(getService(LionEnvironmentService), Effect.flatMap((environment) => getBinding(environment, name)), Effect.map(Option.getOrElse(() => name)));
6
+ const evaluateReference = (name) => pipe(Effect.service(LionEnvironmentService), Effect.flatMap((environment) => getBinding(environment, name)), Effect.map(Option.getOrElse(() => name)));
7
7
  //#endregion
8
8
  export { evaluatePrimitive, evaluateReference };
9
9
 
@@ -1 +1 @@
1
- {"version":3,"file":"primitive.mjs","names":["Str"],"sources":["../../../src/evaluation/base-forms/primitive.ts"],"sourcesContent":["import { Effect, Match, Option, pipe, String as Str } from \"effect\";\nimport { getBinding } from \"@/evaluation/environment\";\nimport type { JsonPrimitiveType } from \"@/schemas/json-primitive\";\nimport { getService, LionEnvironmentService } from \"@/services/evaluation.ts\";\n\nexport const evaluatePrimitive = (expression: JsonPrimitiveType) =>\n pipe(\n Match.value(expression),\n Match.when(Str.isString, evaluateReference),\n Match.orElse(Effect.succeed)\n );\n\nexport const evaluateReference = (name: string) =>\n pipe(\n getService(LionEnvironmentService),\n Effect.flatMap((environment) => getBinding(environment, name)),\n Effect.map(Option.getOrElse(() => name))\n );\n"],"mappings":";;;;AAKA,MAAa,qBAAqB,eAChC,KACE,MAAM,MAAM,WAAW,EACvB,MAAM,KAAKA,OAAI,UAAU,kBAAkB,EAC3C,MAAM,OAAO,OAAO,QAAQ,CAC7B;AAEH,MAAa,qBAAqB,SAChC,KACE,WAAW,uBAAuB,EAClC,OAAO,SAAS,gBAAgB,WAAW,aAAa,KAAK,CAAC,EAC9D,OAAO,IAAI,OAAO,gBAAgB,KAAK,CAAC,CACzC"}
1
+ {"version":3,"file":"primitive.mjs","names":["Str"],"sources":["../../../src/evaluation/base-forms/primitive.ts"],"sourcesContent":["import { Effect, Match, Option, pipe, String as Str } from \"effect\";\nimport { getBinding } from \"@/evaluation/environment\";\nimport type { JsonPrimitiveType } from \"@/schemas/json-primitive\";\nimport { LionEnvironmentService } from \"@/services/evaluation.ts\";\n\nexport const evaluatePrimitive = (expression: JsonPrimitiveType) =>\n pipe(\n Match.value(expression),\n Match.when(Str.isString, evaluateReference),\n Match.orElse(Effect.succeed)\n );\n\nexport const evaluateReference = (name: string) =>\n pipe(\n Effect.service(LionEnvironmentService),\n Effect.flatMap((environment) => getBinding(environment, name)),\n Effect.map(Option.getOrElse(() => name))\n );\n"],"mappings":";;;;AAKA,MAAa,qBAAqB,eAChC,KACE,MAAM,MAAM,WAAW,EACvB,MAAM,KAAKA,OAAI,UAAU,kBAAkB,EAC3C,MAAM,OAAO,OAAO,QAAQ,CAC7B;AAEH,MAAa,qBAAqB,SAChC,KACE,OAAO,QAAQ,uBAAuB,EACtC,OAAO,SAAS,gBAAgB,WAAW,aAAa,KAAK,CAAC,EAC9D,OAAO,IAAI,OAAO,gBAAgB,KAAK,CAAC,CACzC"}
@@ -1,13 +1,13 @@
1
- import { s as LionRecordExpressionType } from "../../lion-expression-6Y3itx9l.mjs";
2
- import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../../evaluation-AblffSQw.mjs";
3
- import { t as LionEnvironmentService } from "../../evaluation-EqzK8tQV.mjs";
1
+ import { s as LionRecordExpressionType } from "../../lion-expression-DMR7Psmu.mjs";
2
+ import { n as InvalidFunctionCallError, t as ArgumentMismatchError } from "../../evaluation-B6K0DbPS.mjs";
3
+ import { t as LionEnvironmentService } from "../../evaluation-Bs36vy1h.mjs";
4
4
  import { Effect } from "effect";
5
- import * as _$effect_ParseResult0 from "effect/ParseResult";
5
+ import * as _$effect_Schema0 from "effect/Schema";
6
6
 
7
7
  //#region src/evaluation/base-forms/record.d.ts
8
8
  declare const evaluateRecord: (expression: LionRecordExpressionType) => Effect.Effect<{
9
9
  [x: string]: unknown;
10
- }, ArgumentMismatchError | InvalidFunctionCallError | _$effect_ParseResult0.ParseError, LionEnvironmentService>;
10
+ }, _$effect_Schema0.SchemaError | ArgumentMismatchError | InvalidFunctionCallError, LionEnvironmentService>;
11
11
  //#endregion
12
12
  export { evaluateRecord };
13
13
  //# sourceMappingURL=record.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"record.d.mts","names":[],"sources":["../../../src/evaluation/base-forms/record.ts"],"mappings":";;;;;;;cAIa,cAAA,GAAkB,UAAA,EAAY,wBAAA,KAAwB,MAAA,CAAA,MAAA;EAAA;GAAA,qBAAA"}
1
+ {"version":3,"file":"record.d.mts","names":[],"sources":["../../../src/evaluation/base-forms/record.ts"],"mappings":";;;;;;;cAIa,cAAA,GAAkB,UAAA,EAAY,wBAAA,KAAwB,MAAA,CAAA,MAAA;EAAA;GAAA,gBAAA,CAAA,WAAA"}
@@ -1,2 +1,2 @@
1
- import { r as evaluateRecord } from "../../evaluate-D7ODMrbg.mjs";
1
+ import { r as evaluateRecord } from "../../evaluate-BJOG7kaS.mjs";
2
2
  export { evaluateRecord };
@@ -1,4 +1,4 @@
1
- import { a as ToplevelEnvironment, r as InnerEnvironment, t as Environment } from "../environment-k2Uf6VVc.mjs";
1
+ import { a as ToplevelEnvironment, r as InnerEnvironment, t as Environment } from "../environment-BQw8BPXl.mjs";
2
2
  import { Effect, Option } from "effect";
3
3
 
4
4
  //#region src/evaluation/environment.d.ts
@@ -1 +1 @@
1
- {"version":3,"file":"environment.d.mts","names":[],"sources":["../../src/evaluation/environment.ts"],"mappings":";;;;iBASgB,eAAA,CACd,QAAA,EAAU,MAAA,oBACT,MAAA,CAAO,MAAA,CAAO,mBAAA;AAAA,iBAED,eAAA,CACd,QAAA,EAAU,MAAA,mBACV,MAAA,EAAQ,WAAA,GACP,MAAA,CAAO,MAAA,CAAO,gBAAA;AAAA,cAeJ,UAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,aACC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,cAqBX,eAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,UACA,KAAA,cACC,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,cAOJ,gBAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,UACA,KAAA,cACC,MAAA,CAAO,MAAA,CAAO,WAAA"}
1
+ {"version":3,"file":"environment.d.mts","names":[],"sources":["../../src/evaluation/environment.ts"],"mappings":";;;;iBAWgB,eAAA,CACd,QAAA,EAAU,MAAA,oBACT,MAAA,CAAO,MAAA,CAAO,mBAAA;AAAA,iBAED,eAAA,CACd,QAAA,EAAU,MAAA,mBACV,MAAA,EAAQ,WAAA,GACP,MAAA,CAAO,MAAA,CAAO,gBAAA;AAAA,cAeJ,UAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,aACC,MAAA,CAAO,MAAA,CAAO,MAAA,CAAO,MAAA;AAAA,cAcX,eAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,UACA,KAAA,cACC,MAAA,CAAO,MAAA,CAAO,WAAA;AAAA,cAOJ,gBAAA,GACX,WAAA,EAAa,WAAA,EACb,IAAA,UACA,KAAA,cACC,MAAA,CAAO,MAAA,CAAO,WAAA"}
@@ -1,18 +1,21 @@
1
- import { InnerEnvironmentSchema, ToplevelEnvironmentSchema } from "../schemas/environment.mjs";
2
- import { Effect, Match, Option, Record, Ref, Schema, pipe } from "effect";
1
+ import { Effect, Option, Record, Ref, pipe } from "effect";
3
2
  //#region src/evaluation/environment.ts
3
+ const isInnerEnvironment = (environment) => "parent" in environment;
4
4
  function makeEnvironment(bindings, parent) {
5
5
  return Ref.make(bindings).pipe(Effect.map((bindingsRef) => typeof parent === "undefined" ? { bindingsRef } : {
6
6
  bindingsRef,
7
7
  parent
8
8
  }));
9
9
  }
10
- const getBinding = (environment, name) => pipe(Match.value(environment), Match.when(Schema.is(InnerEnvironmentSchema), ({ bindingsRef, parent }) => pipe(Ref.get(bindingsRef), Effect.map(Record.get(name)), Effect.flatMap(Option.match({
11
- onSome: (binding) => Effect.succeed(Option.some(binding)),
12
- onNone: () => getBinding(parent, name)
13
- })))), Match.when(Schema.is(ToplevelEnvironmentSchema), ({ bindingsRef }) => pipe(Ref.get(bindingsRef), Effect.map(Record.get(name)))), Match.exhaustive);
10
+ const getBinding = (environment, name) => Effect.gen(function* () {
11
+ const binding = yield* pipe(Ref.get(environment.bindingsRef), Effect.map(Record.get(name)));
12
+ if (Option.isSome(binding)) return binding;
13
+ return isInnerEnvironment(environment) ? yield* getBinding(environment.parent, name) : Option.none();
14
+ });
14
15
  const setLocalBinding = (environment, name, value) => pipe(environment.bindingsRef, Ref.update(Record.set(name, value)), Effect.as(environment));
15
- const setGlobalBinding = (environment, name, value) => pipe(Match.value(environment), Match.when(Schema.is(InnerEnvironmentSchema), ({ parent }) => setGlobalBinding(parent, name, value)), Match.when(Schema.is(ToplevelEnvironmentSchema), ({ bindingsRef }) => Ref.update(bindingsRef, Record.set(name, value))), Match.exhaustive, Effect.map(() => environment));
16
+ const setGlobalBinding = (environment, name, value) => {
17
+ return (isInnerEnvironment(environment) ? setGlobalBinding(environment.parent, name, value) : Ref.update(environment.bindingsRef, Record.set(name, value))).pipe(Effect.as(environment));
18
+ };
16
19
  //#endregion
17
20
  export { getBinding, makeEnvironment, setGlobalBinding, setLocalBinding };
18
21