effect-grammar 0.2.0 → 0.3.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 +164 -76
- package/dist/combinators.d.ts +66 -21
- package/dist/combinators.d.ts.map +1 -1
- package/dist/combinators.js +150 -47
- package/dist/combinators.js.map +1 -1
- package/dist/core.d.ts +111 -39
- package/dist/core.d.ts.map +1 -1
- package/dist/core.js +24 -20
- package/dist/core.js.map +1 -1
- package/dist/env.d.ts +20 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +63 -0
- package/dist/env.js.map +1 -0
- package/dist/errors.d.ts +34 -1
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +37 -4
- package/dist/errors.js.map +1 -1
- package/dist/gen.d.ts +7 -0
- package/dist/gen.d.ts.map +1 -0
- package/dist/gen.js +200 -0
- package/dist/gen.js.map +1 -0
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/parse.d.ts.map +1 -1
- package/dist/parse.js +152 -114
- package/dist/parse.js.map +1 -1
- package/dist/pattern.d.ts +5 -0
- package/dist/pattern.d.ts.map +1 -0
- package/dist/pattern.js +46 -0
- package/dist/pattern.js.map +1 -0
- package/dist/print.d.ts +2 -1
- package/dist/print.d.ts.map +1 -1
- package/dist/print.js +201 -89
- package/dist/print.js.map +1 -1
- package/dist/recovery.d.ts +10 -0
- package/dist/recovery.d.ts.map +1 -0
- package/dist/recovery.js +296 -0
- package/dist/recovery.js.map +1 -0
- package/dist/render.d.ts +4 -4
- package/dist/render.d.ts.map +1 -1
- package/dist/render.js +133 -42
- package/dist/render.js.map +1 -1
- package/dist/schema.d.ts +1 -1
- package/dist/schema.d.ts.map +1 -1
- package/dist/schema.js +11 -4
- package/dist/schema.js.map +1 -1
- package/package.json +32 -16
package/dist/parse.js
CHANGED
|
@@ -1,157 +1,195 @@
|
|
|
1
1
|
import { Result } from "effect";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
2
|
+
import { nodeOf, resolve, unsafeToNever, } from "./core.js";
|
|
3
|
+
import { bind, caseFor, evaluate, frame, isCount, materialize, Unbound } from "./env.js";
|
|
4
|
+
import { exceptionMessage, ParseError, preview } from "./errors.js";
|
|
4
5
|
import { describe } from "./render.js";
|
|
5
|
-
const
|
|
6
|
-
const failAt = (
|
|
7
|
-
if (
|
|
8
|
-
|
|
9
|
-
|
|
6
|
+
const Fail = Symbol("effect-grammar/ParseFail");
|
|
7
|
+
const failAt = (state, expected) => {
|
|
8
|
+
if (state.pos > state.furthest) {
|
|
9
|
+
state.furthest = state.pos;
|
|
10
|
+
state.expected = new Set([expected]);
|
|
10
11
|
}
|
|
11
|
-
else if (
|
|
12
|
-
|
|
12
|
+
else if (state.pos === state.furthest) {
|
|
13
|
+
state.expected.add(expected);
|
|
13
14
|
}
|
|
14
|
-
return
|
|
15
|
+
return Fail;
|
|
15
16
|
};
|
|
16
|
-
const
|
|
17
|
-
const
|
|
18
|
-
|
|
19
|
-
switch (n._tag) {
|
|
17
|
+
const go = (grammar, state, env) => {
|
|
18
|
+
const node = nodeOf(grammar);
|
|
19
|
+
switch (node._tag) {
|
|
20
20
|
case "Literal": {
|
|
21
|
-
if (
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
21
|
+
if (state.input.startsWith(node.value, state.pos)) {
|
|
22
|
+
state.pos += node.value.length;
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
// Failure path only: report at the first mismatching character.
|
|
26
|
+
const end = state.pos + node.value.length;
|
|
27
|
+
let current = state.pos;
|
|
28
|
+
while (current < end && state.input[current] === node.value[current - state.pos])
|
|
29
|
+
current++;
|
|
30
|
+
state.pos = current;
|
|
31
|
+
return failAt(state, JSON.stringify(node.value));
|
|
25
32
|
}
|
|
26
33
|
case "Regex": {
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
if (
|
|
30
|
-
return failAt(
|
|
31
|
-
|
|
32
|
-
return
|
|
33
|
-
}
|
|
34
|
-
case "Seq": {
|
|
35
|
-
const out = new Map();
|
|
36
|
-
for (const p of n.parts) {
|
|
37
|
-
const v = runPart(p, s);
|
|
38
|
-
if (v === FAIL)
|
|
39
|
-
return FAIL;
|
|
40
|
-
if (isField(p))
|
|
41
|
-
out.set(p.name, v);
|
|
42
|
-
}
|
|
43
|
-
return n.parts.some(isField) ? Object.fromEntries(out) : undefined;
|
|
34
|
+
node.re.lastIndex = state.pos;
|
|
35
|
+
const match = node.re.exec(state.input);
|
|
36
|
+
if (match === null)
|
|
37
|
+
return failAt(state, node.name);
|
|
38
|
+
state.pos += match[0].length;
|
|
39
|
+
return match[0];
|
|
44
40
|
}
|
|
45
41
|
case "Gen": {
|
|
46
|
-
const
|
|
47
|
-
const
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
it.return(undefined);
|
|
54
|
-
return FAIL;
|
|
55
|
-
}
|
|
56
|
-
if (isField(p)) {
|
|
57
|
-
if (out.has(p.name)) {
|
|
58
|
-
throw new Error(`gen: field "${p.name}" yielded twice — use many() to repeat`);
|
|
59
|
-
}
|
|
60
|
-
out.set(p.name, v);
|
|
61
|
-
}
|
|
62
|
-
r = it.next(v);
|
|
42
|
+
const local = frame(node.scope, node.slotCount, env);
|
|
43
|
+
for (const step of node.steps) {
|
|
44
|
+
const value = go(step.grammar, state, local);
|
|
45
|
+
if (value === Fail)
|
|
46
|
+
return Fail;
|
|
47
|
+
if (step._tag === "Bind")
|
|
48
|
+
bind(local, step.slot, value);
|
|
63
49
|
}
|
|
64
|
-
|
|
50
|
+
const value = materialize(node.result, local);
|
|
51
|
+
return value === Unbound ? failAt(state, "a bound generator result") : value;
|
|
65
52
|
}
|
|
66
53
|
case "Wrap": {
|
|
67
|
-
if (go(
|
|
68
|
-
return
|
|
69
|
-
const
|
|
70
|
-
if (
|
|
71
|
-
return
|
|
72
|
-
return go(
|
|
54
|
+
if (go(node.open, state, env) === Fail)
|
|
55
|
+
return Fail;
|
|
56
|
+
const value = go(node.inner, state, env);
|
|
57
|
+
if (value === Fail)
|
|
58
|
+
return Fail;
|
|
59
|
+
return go(node.close, state, env) === Fail ? Fail : value;
|
|
73
60
|
}
|
|
74
61
|
case "Choice": {
|
|
75
|
-
const start =
|
|
76
|
-
for (const
|
|
77
|
-
const
|
|
78
|
-
if (
|
|
79
|
-
return
|
|
80
|
-
|
|
62
|
+
const start = state.pos;
|
|
63
|
+
for (const option of node.options) {
|
|
64
|
+
const value = go(option, state, env);
|
|
65
|
+
if (value !== Fail)
|
|
66
|
+
return value;
|
|
67
|
+
state.pos = start;
|
|
81
68
|
}
|
|
82
|
-
return
|
|
69
|
+
return Fail;
|
|
83
70
|
}
|
|
84
71
|
case "Many": {
|
|
85
|
-
const
|
|
86
|
-
let mark =
|
|
87
|
-
while (
|
|
88
|
-
const
|
|
89
|
-
if (
|
|
72
|
+
const values = [];
|
|
73
|
+
let mark = state.pos;
|
|
74
|
+
while (values.length < node.max) {
|
|
75
|
+
const value = go(node.inner, state, env);
|
|
76
|
+
if (value === Fail)
|
|
90
77
|
break;
|
|
91
|
-
if (
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
mark =
|
|
95
|
-
if (go(
|
|
78
|
+
if (state.pos === mark)
|
|
79
|
+
return failAt(state, "a repetition element that consumes input");
|
|
80
|
+
values.push(value);
|
|
81
|
+
mark = state.pos;
|
|
82
|
+
if (go(node.sep, state, env) === Fail)
|
|
96
83
|
break;
|
|
97
84
|
}
|
|
98
|
-
|
|
99
|
-
return
|
|
85
|
+
state.pos = mark;
|
|
86
|
+
return values.length < node.min ? Fail : values;
|
|
100
87
|
}
|
|
101
88
|
case "Optional": {
|
|
102
|
-
const mark =
|
|
103
|
-
const
|
|
104
|
-
if (
|
|
105
|
-
return
|
|
106
|
-
|
|
89
|
+
const mark = state.pos;
|
|
90
|
+
const value = go(node.inner, state, env);
|
|
91
|
+
if (value !== Fail)
|
|
92
|
+
return value;
|
|
93
|
+
state.pos = mark;
|
|
107
94
|
return undefined;
|
|
108
95
|
}
|
|
109
96
|
case "Transform": {
|
|
110
|
-
const start =
|
|
111
|
-
const
|
|
112
|
-
if (
|
|
113
|
-
return
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
97
|
+
const start = state.pos;
|
|
98
|
+
const value = go(node.inner, state, env);
|
|
99
|
+
if (value === Fail)
|
|
100
|
+
return Fail;
|
|
101
|
+
try {
|
|
102
|
+
const decoded = node.decode(unsafeToNever(value));
|
|
103
|
+
if (Result.isFailure(decoded)) {
|
|
104
|
+
state.pos = start;
|
|
105
|
+
return failAt(state, decoded.failure.message);
|
|
106
|
+
}
|
|
107
|
+
if (node.is?.(unsafeToNever(decoded.success)) === false) {
|
|
108
|
+
state.pos = start;
|
|
109
|
+
return failAt(state, node.name ?? describe(node.inner));
|
|
110
|
+
}
|
|
111
|
+
return decoded.success;
|
|
112
|
+
}
|
|
113
|
+
catch (error) {
|
|
114
|
+
state.pos = start;
|
|
115
|
+
return failAt(state, `${node.name ?? describe(node.inner)}: ${exceptionMessage(error)}`);
|
|
118
116
|
}
|
|
119
|
-
return b;
|
|
120
117
|
}
|
|
121
118
|
case "Skip":
|
|
122
|
-
return go(
|
|
119
|
+
return go(node.inner, state, env) === Fail ? Fail : undefined;
|
|
123
120
|
case "Label": {
|
|
124
|
-
const start =
|
|
125
|
-
|
|
126
|
-
const
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return
|
|
121
|
+
const start = state.pos;
|
|
122
|
+
const siblings = state.furthest === start ? [...state.expected] : [];
|
|
123
|
+
const value = go(node.inner, state, env);
|
|
124
|
+
if (value === Fail && state.furthest === start) {
|
|
125
|
+
state.expected = new Set([...siblings, node.name]);
|
|
126
|
+
}
|
|
127
|
+
return value;
|
|
131
128
|
}
|
|
132
129
|
case "Suspend":
|
|
133
|
-
return go(resolve(
|
|
130
|
+
return go(resolve(node), state, env);
|
|
131
|
+
case "Match": {
|
|
132
|
+
const key = evaluate(node.scrutinee, env);
|
|
133
|
+
if (key === Unbound)
|
|
134
|
+
return failAt(state, "a bound match ref");
|
|
135
|
+
const matchCase = caseFor(node.cases, key);
|
|
136
|
+
if (matchCase === undefined)
|
|
137
|
+
return failAt(state, `a match case for ${preview(key)}`);
|
|
138
|
+
return go(matchCase.grammar, state, env);
|
|
139
|
+
}
|
|
140
|
+
case "Take": {
|
|
141
|
+
const count = evaluate(node.count, env);
|
|
142
|
+
if (count === Unbound)
|
|
143
|
+
return failAt(state, "a bound take count");
|
|
144
|
+
if (!isCount(count))
|
|
145
|
+
return failAt(state, `<char>{${preview(count)}}`);
|
|
146
|
+
if (state.input.length - state.pos < count) {
|
|
147
|
+
return failAt(state, `${count} chars`);
|
|
148
|
+
}
|
|
149
|
+
const value = state.input.slice(state.pos, state.pos + count);
|
|
150
|
+
state.pos += count;
|
|
151
|
+
return value;
|
|
152
|
+
}
|
|
153
|
+
case "RepeatExact": {
|
|
154
|
+
const count = evaluate(node.count, env);
|
|
155
|
+
if (count === Unbound)
|
|
156
|
+
return failAt(state, "a bound repeat count");
|
|
157
|
+
if (!isCount(count))
|
|
158
|
+
return failAt(state, `a non-negative repeat count`);
|
|
159
|
+
const values = [];
|
|
160
|
+
for (let index = 0; index < count; index++) {
|
|
161
|
+
const mark = state.pos;
|
|
162
|
+
const value = go(node.inner, state, env);
|
|
163
|
+
if (value === Fail)
|
|
164
|
+
return Fail;
|
|
165
|
+
if (state.pos === mark)
|
|
166
|
+
return failAt(state, "a repetition element that consumes input");
|
|
167
|
+
values.push(value);
|
|
168
|
+
}
|
|
169
|
+
return values;
|
|
170
|
+
}
|
|
134
171
|
}
|
|
135
172
|
};
|
|
136
|
-
const toError = (
|
|
137
|
-
const before =
|
|
173
|
+
const toError = (state) => {
|
|
174
|
+
const before = state.input.slice(0, state.furthest);
|
|
175
|
+
const code = state.input.codePointAt(state.furthest);
|
|
138
176
|
return new ParseError({
|
|
139
|
-
pos:
|
|
177
|
+
pos: state.furthest,
|
|
140
178
|
line: before.split("\n").length,
|
|
141
179
|
column: before.length - before.lastIndexOf("\n"),
|
|
142
|
-
expected: [...
|
|
143
|
-
found:
|
|
180
|
+
expected: [...state.expected],
|
|
181
|
+
found: code === undefined ? undefined : String.fromCodePoint(code),
|
|
144
182
|
});
|
|
145
183
|
};
|
|
146
184
|
export const parse = (grammar, input) => {
|
|
147
|
-
const
|
|
148
|
-
const
|
|
149
|
-
if (
|
|
150
|
-
// SAFETY:
|
|
151
|
-
return Result.succeed(
|
|
185
|
+
const state = { input, pos: 0, furthest: 0, expected: new Set() };
|
|
186
|
+
const value = go(grammar, state, undefined);
|
|
187
|
+
if (value !== Fail && state.pos === input.length) {
|
|
188
|
+
// SAFETY: interpreting Grammar<A> preserves its output type across every node.
|
|
189
|
+
return Result.succeed(value);
|
|
152
190
|
}
|
|
153
|
-
if (
|
|
154
|
-
failAt(
|
|
155
|
-
return Result.fail(toError(
|
|
191
|
+
if (value !== Fail)
|
|
192
|
+
failAt(state, "end of input");
|
|
193
|
+
return Result.fail(toError(state));
|
|
156
194
|
};
|
|
157
195
|
//# sourceMappingURL=parse.js.map
|
package/dist/parse.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE/B,OAAO,
|
|
1
|
+
{"version":3,"file":"parse.js","sourceRoot":"","sources":["../src/parse.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { Pattern, Value } from "./core.ts";
|
|
2
|
+
import { type Frame } from "./env.ts";
|
|
3
|
+
import type { PrintIssue } from "./errors.ts";
|
|
4
|
+
export declare const unifyPattern: (pattern: Pattern, value: Value, values: Frame) => PrintIssue | undefined;
|
|
5
|
+
//# sourceMappingURL=pattern.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.d.ts","sourceRoot":"","sources":["../src/pattern.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,WAAW,CAAA;AAC/C,OAAO,EAAQ,KAAK,KAAK,EAAE,MAAM,UAAU,CAAA;AAC3C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAE7C,eAAO,MAAM,YAAY,YACd,OAAO,SACT,KAAK,UACJ,KAAK,KACZ,UAAU,GAAG,SAwCf,CAAA"}
|
package/dist/pattern.js
ADDED
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import { Equal, Predicate } from "effect";
|
|
2
|
+
import { bind } from "./env.js";
|
|
3
|
+
export const unifyPattern = (pattern, value, values) => {
|
|
4
|
+
switch (pattern._tag) {
|
|
5
|
+
case "Ref":
|
|
6
|
+
bind(values, pattern.slot, value);
|
|
7
|
+
return undefined;
|
|
8
|
+
case "Const":
|
|
9
|
+
return Equal.equals(value, pattern.value)
|
|
10
|
+
? undefined
|
|
11
|
+
: { _tag: "ConstantMismatch", expected: pattern.value, actual: value };
|
|
12
|
+
case "Object": {
|
|
13
|
+
if (!Predicate.isObject(value) || Array.isArray(value)) {
|
|
14
|
+
return { _tag: "TypeMismatch", expected: "an object", actual: value };
|
|
15
|
+
}
|
|
16
|
+
for (const [key, field] of pattern.fields) {
|
|
17
|
+
if (!Object.hasOwn(value, key)) {
|
|
18
|
+
return { _tag: "AtPath", path: key, issue: { _tag: "MissingField", field: key } };
|
|
19
|
+
}
|
|
20
|
+
const issue = unifyPattern(field, value[key], values);
|
|
21
|
+
if (issue !== undefined)
|
|
22
|
+
return { _tag: "AtPath", path: key, issue };
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
case "Array": {
|
|
27
|
+
if (!Array.isArray(value))
|
|
28
|
+
return { _tag: "TypeMismatch", expected: "an array", actual: value };
|
|
29
|
+
if (value.length !== pattern.items.length) {
|
|
30
|
+
return {
|
|
31
|
+
_tag: "InvalidValue",
|
|
32
|
+
expected: `${pattern.items.length} items`,
|
|
33
|
+
actual: value.length,
|
|
34
|
+
detail: `expected ${pattern.items.length} items, got ${value.length}`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
for (const [index, item] of pattern.items.entries()) {
|
|
38
|
+
const issue = unifyPattern(item, value[index], values);
|
|
39
|
+
if (issue !== undefined)
|
|
40
|
+
return { _tag: "AtPath", path: index, issue };
|
|
41
|
+
}
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
};
|
|
46
|
+
//# sourceMappingURL=pattern.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern.js","sourceRoot":"","sources":["../src/pattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AAGzC,OAAO,EAAE,IAAI,EAAc,MAAM,UAAU,CAAA;AAG3C,MAAM,CAAC,MAAM,YAAY,GAAG,CAC1B,OAAgB,EAChB,KAAY,EACZ,MAAa,EACW,EAAE;IAC1B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;QACrB,KAAK,KAAK;YACR,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;YACjC,OAAO,SAAS,CAAA;QAClB,KAAK,OAAO;YACV,OAAO,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;gBACvC,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,EAAE,IAAI,EAAE,kBAAkB,EAAE,QAAQ,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;QAC1E,KAAK,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvD,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;YACvE,CAAC;YACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBAC1C,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,EAAE,CAAC;oBAC/B,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,CAAA;gBACnF,CAAC;gBACD,MAAM,KAAK,GAAG,YAAY,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAAA;gBACrD,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,CAAA;YACtE,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;QACD,KAAK,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;gBACvB,OAAO,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,CAAA;YACtE,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;gBAC1C,OAAO;oBACL,IAAI,EAAE,cAAc;oBACpB,QAAQ,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,QAAQ;oBACzC,MAAM,EAAE,KAAK,CAAC,MAAM;oBACpB,MAAM,EAAE,YAAY,OAAO,CAAC,KAAK,CAAC,MAAM,eAAe,KAAK,CAAC,MAAM,EAAE;iBACtE,CAAA;YACH,CAAC;YACD,KAAK,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;gBACpD,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,CAAA;gBACtD,IAAI,KAAK,KAAK,SAAS;oBAAE,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,CAAA;YACxE,CAAC;YACD,OAAO,SAAS,CAAA;QAClB,CAAC;IACH,CAAC;AACH,CAAC,CAAA"}
|
package/dist/print.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Result } from "effect";
|
|
2
|
-
import { type Grammar } from "./core.ts";
|
|
2
|
+
import { type Grammar, type GrammarInternal, type Value } from "./core.ts";
|
|
3
3
|
import { PrintError } from "./errors.ts";
|
|
4
|
+
export declare const printUnknown: (grammar: GrammarInternal, value: Value) => Result.Result<string, PrintError>;
|
|
4
5
|
export declare const print: <A>(grammar: Grammar<A>, value: A) => Result.Result<string, PrintError>;
|
|
5
6
|
//# sourceMappingURL=print.d.ts.map
|
package/dist/print.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"print.d.ts","sourceRoot":"","sources":["../src/print.ts"],"names":[],"mappings":"AAAA,OAAO,EAAa,MAAM,EAAE,MAAM,QAAQ,CAAA;AAE1C,OAAO,EACL,KAAK,OAAO,EACZ,KAAK,eAAe,EAOpB,KAAK,KAAK,EACX,MAAM,WAAW,CAAA;AAElB,OAAO,EAA6B,UAAU,EAAmB,MAAM,aAAa,CAAA;AAwOpF,eAAO,MAAM,YAAY,YACd,eAAe,SACjB,KAAK,KACX,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAKlC,CAAA;AAED,eAAO,MAAM,KAAK,GAAI,CAAC,WAAW,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAC3D,CAAA"}
|