effect-grammar 0.4.0 → 0.5.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 (72) hide show
  1. package/README.md +175 -87
  2. package/dist/binary.d.ts +64 -0
  3. package/dist/binary.d.ts.map +1 -0
  4. package/dist/binary.js +246 -0
  5. package/dist/binary.js.map +1 -0
  6. package/dist/codec.d.ts +17 -0
  7. package/dist/codec.d.ts.map +1 -0
  8. package/dist/codec.js +14 -0
  9. package/dist/codec.js.map +1 -0
  10. package/dist/combinators.d.ts +112 -6
  11. package/dist/combinators.d.ts.map +1 -1
  12. package/dist/combinators.js +218 -28
  13. package/dist/combinators.js.map +1 -1
  14. package/dist/compile.d.ts +36 -0
  15. package/dist/compile.d.ts.map +1 -0
  16. package/dist/compile.js +228 -0
  17. package/dist/compile.js.map +1 -0
  18. package/dist/core.d.ts +34 -1
  19. package/dist/core.d.ts.map +1 -1
  20. package/dist/core.js +51 -1
  21. package/dist/core.js.map +1 -1
  22. package/dist/env.d.ts +5 -0
  23. package/dist/env.d.ts.map +1 -1
  24. package/dist/env.js +20 -1
  25. package/dist/env.js.map +1 -1
  26. package/dist/errors.d.ts +12 -0
  27. package/dist/errors.d.ts.map +1 -1
  28. package/dist/errors.js +40 -4
  29. package/dist/errors.js.map +1 -1
  30. package/dist/gen.d.ts.map +1 -1
  31. package/dist/gen.js +5 -7
  32. package/dist/gen.js.map +1 -1
  33. package/dist/index.d.ts +5 -4
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/index.js +3 -2
  36. package/dist/index.js.map +1 -1
  37. package/dist/parse.d.ts +10 -1
  38. package/dist/parse.d.ts.map +1 -1
  39. package/dist/parse.js +81 -19
  40. package/dist/parse.js.map +1 -1
  41. package/dist/pattern.d.ts +2 -1
  42. package/dist/pattern.d.ts.map +1 -1
  43. package/dist/pattern.js +46 -2
  44. package/dist/pattern.js.map +1 -1
  45. package/dist/print.d.ts +8 -0
  46. package/dist/print.d.ts.map +1 -1
  47. package/dist/print.js +136 -18
  48. package/dist/print.js.map +1 -1
  49. package/dist/render.d.ts.map +1 -1
  50. package/dist/render.js +33 -6
  51. package/dist/render.js.map +1 -1
  52. package/dist/schema.d.ts +8 -3
  53. package/dist/schema.d.ts.map +1 -1
  54. package/dist/schema.js +11 -13
  55. package/dist/schema.js.map +1 -1
  56. package/dist/testing.d.ts +18 -0
  57. package/dist/testing.d.ts.map +1 -0
  58. package/dist/testing.js +72 -0
  59. package/dist/testing.js.map +1 -0
  60. package/package.json +9 -3
  61. package/dist/ast.d.ts +0 -115
  62. package/dist/ast.d.ts.map +0 -1
  63. package/dist/ast.js +0 -253
  64. package/dist/ast.js.map +0 -1
  65. package/dist/grammar.d.ts +0 -8
  66. package/dist/grammar.d.ts.map +0 -1
  67. package/dist/grammar.js +0 -8
  68. package/dist/grammar.js.map +0 -1
  69. package/dist/recovery.d.ts +0 -10
  70. package/dist/recovery.d.ts.map +0 -1
  71. package/dist/recovery.js +0 -296
  72. package/dist/recovery.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.d.ts","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,MAAM,EAAE,MAAM,EAAqC,MAAM,QAAQ,CAAA;AAEvF,OAAO,KAAK,EAAE,eAAe,EAAS,MAAM,WAAW,CAAA;AAEvD,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AAUxC,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAA;IAC5B;;;;;OAKG;IACH,QAAQ,CAAC,SAAS,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAA;CACtC;AAED,eAAO,MAAM,SAAS,GAAI,CAAC,EAAE,CAAC,SAAS,MAAM,CAAC,GAAG,UACvC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,UACf,CAAC,WACA,eAAe,cACZ,MAAM,GAAG,SAAS,SACvB,CAAC,KAAK,EAAE,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,SACvE,CAAC,KAAK,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,UAAU,CAAC,uEAiB3D,CAAA"}
package/dist/codec.js ADDED
@@ -0,0 +1,14 @@
1
+ import { Effect, Schema, SchemaIssue, SchemaTransformation } from "effect";
2
+ import { PrintError } from "./errors.js";
3
+ import { render } from "./render.js";
4
+ const printIssueToSchema = (actual, issue) => {
5
+ if (issue._tag === "AtPath") {
6
+ return new SchemaIssue.Pointer([issue.path], printIssueToSchema(actual, issue.issue));
7
+ }
8
+ return new SchemaIssue.InvalidValue({ message: PrintError.format(issue) }, actual);
9
+ };
10
+ export const codecFrom = (source, target, grammar, identifier, parse, print) => source.pipe(Schema.decodeTo(target, SchemaTransformation.transformOrFail({
11
+ decode: (input) => Effect.fromResult(parse(input)).pipe(Effect.mapError(({ message }) => new SchemaIssue.InvalidValue({ message }, input))),
12
+ encode: (value) => Effect.fromResult(print(value)).pipe(Effect.mapError((error) => printIssueToSchema(value, error.issue))),
13
+ })), Schema.annotate({ identifier, description: render(grammar) }));
14
+ //# sourceMappingURL=codec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codec.js","sourceRoot":"","sources":["../src/codec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAe,MAAM,EAAE,WAAW,EAAE,oBAAoB,EAAE,MAAM,QAAQ,CAAA;AAIvF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAA;AAEpC,MAAM,kBAAkB,GAAG,CAAC,MAAa,EAAE,KAAiB,EAAqB,EAAE;IACjF,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC5B,OAAO,IAAI,WAAW,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,kBAAkB,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CAAA;IACvF,CAAC;IACD,OAAO,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,CAAC,CAAA;AACpF,CAAC,CAAA;AAaD,MAAM,CAAC,MAAM,SAAS,GAAG,CACvB,MAAuB,EACvB,MAAS,EACT,OAAwB,EACxB,UAA8B,EAC9B,KAA8E,EAC9E,KAA4D,EAC5D,EAAE,CACF,MAAM,CAAC,IAAI,CACT,MAAM,CAAC,QAAQ,CACb,MAAM,EACN,oBAAoB,CAAC,eAAe,CAAkB;IACpD,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,IAAI,WAAW,CAAC,YAAY,CAAC,EAAE,OAAO,EAAE,EAAE,KAAK,CAAC,CAAC,CACnF;IACH,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAChB,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAClC,MAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC,CACnE;CACJ,CAAC,CACH,EACD,MAAM,CAAC,QAAQ,CAAC,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAC9D,CAAA"}
@@ -1,22 +1,39 @@
1
- import { Result, Schema } from "effect";
1
+ import { Result, Schema, type Types } from "effect";
2
2
  import { type Grammar, type GrammarInternal, type GrammarIssue, type MatchKey, type Ref, type Silent, type Type } from "./core.ts";
3
3
  export { gen, type GenGrammar, get, seq } from "./gen.ts";
4
4
  export declare const literal: (value: string) => Silent;
5
5
  export declare const empty: Silent;
6
+ /**
7
+ * Match at the parser's current cursor using JavaScript `RegExp` semantics.
8
+ * Parsing uses a fresh sticky matcher against the original full input; printing
9
+ * requires the supplied string to match in full. `g`, `y`, and the caller's
10
+ * `lastIndex` are ignored, and the caller's expression is never mutated.
11
+ */
6
12
  export declare const regex: (expression: RegExp, name: string) => Grammar<string>;
7
13
  type PreserveGrammar<G extends GrammarInternal> = G extends Silent ? Silent : G extends Grammar<infer A> ? Grammar<A> : never;
8
14
  type OptionalGrammar<G extends GrammarInternal> = G extends Silent ? Silent : G extends Grammar<infer A> ? Grammar<A | undefined> : never;
9
15
  export declare function between(open: Silent | string, close: Silent | string): <G extends GrammarInternal>(inner: G) => PreserveGrammar<G>;
10
16
  export declare function between(open: Silent | string, inner: Silent, close: Silent | string): Silent;
11
17
  export declare function between<A>(open: Silent | string, inner: Grammar<A>, close: Silent | string): Grammar<A>;
12
- export declare const wrap: typeof between;
13
18
  export declare function prefix(open: Silent | string): <G extends GrammarInternal>(inner: G) => PreserveGrammar<G>;
14
19
  export declare function prefix(open: Silent | string, inner: Silent): Silent;
15
20
  export declare function prefix<A>(open: Silent | string, inner: Grammar<A>): Grammar<A>;
16
21
  export declare function suffix(close: Silent | string): <G extends GrammarInternal>(inner: G) => PreserveGrammar<G>;
17
22
  export declare function suffix(inner: Silent, close: Silent | string): Silent;
18
23
  export declare function suffix<A>(inner: Grammar<A>, close: Silent | string): Grammar<A>;
24
+ /**
25
+ * Ordered alternatives. Parsing tries each branch in order and keeps the
26
+ * first that matches. Printing keeps the first branch whose printer accepts
27
+ * the value; use `checkedChoice` to keep the first branch whose text also
28
+ * parses back.
29
+ */
19
30
  export declare const choice: <const Grammars extends readonly [GrammarInternal, ...Array<GrammarInternal>]>(...options: Grammars) => Grammar<Type<Grammars[number]>>;
31
+ /**
32
+ * {@link choice} whose printer selects the first branch that reads back to an
33
+ * equal value. Each checked choice reparses its candidate output; nesting can
34
+ * multiply that work, so keep it off hot paths.
35
+ */
36
+ export declare const checkedChoice: <const Grammars extends readonly [GrammarInternal, ...Array<GrammarInternal>]>(...options: Grammars) => Grammar<Type<Grammars[number]>>;
20
37
  export declare function optional(): <G extends GrammarInternal>(inner: G) => OptionalGrammar<G>;
21
38
  export declare function optional(inner: Silent): Silent;
22
39
  export declare function optional<A>(inner: Grammar<A>): Grammar<A | undefined>;
@@ -24,10 +41,12 @@ export interface RepeatOptions {
24
41
  readonly min?: number;
25
42
  readonly max?: number;
26
43
  }
44
+ /** Repeat an item within bounds. Each successful parse must consume input. */
27
45
  export declare const many: {
28
46
  <A>(inner: Grammar<A>, options?: RepeatOptions): Grammar<ReadonlyArray<A>>;
29
47
  (options?: RepeatOptions): <A>(inner: Grammar<A>) => Grammar<ReadonlyArray<A>>;
30
48
  };
49
+ /** Repeat an item with a silent separator. Each successful item parse must consume input. */
31
50
  export declare const sepBy: {
32
51
  <A>(inner: Grammar<A>, separator: Silent | string, options?: RepeatOptions): Grammar<ReadonlyArray<A>>;
33
52
  (separator: Silent | string, options?: RepeatOptions): <A>(inner: Grammar<A>) => Grammar<ReadonlyArray<A>>;
@@ -38,10 +57,12 @@ export declare const match: <K extends string, const Cases extends Readonly<Reco
38
57
  type EntryOutput<Entries extends ReadonlyArray<readonly [MatchKey, GrammarInternal]>> = Type<Entries[number][1]>;
39
58
  type CompleteEntries<K extends MatchKey, Entries extends ReadonlyArray<readonly [MatchKey, GrammarInternal]>> = Exclude<K, Entries[number][0]> extends never ? Entries : never;
40
59
  export declare const matchValue: <K extends MatchKey, const Entries extends ReadonlyArray<readonly [K, GrammarInternal]>>(scrutinee: Ref<K>, entries: CompleteEntries<K, Entries>) => Grammar<EntryOutput<Entries>>;
41
- export declare const take: (count: Ref<number>) => Grammar<string>;
60
+ export declare const take: (count: Ref<number> | number) => Grammar<string>;
61
+ export declare const takeBytes: (count: Ref<number> | number, name?: string) => Grammar<string>;
62
+ /** Repeat an item a constant or bound number of times. Each successful parse must consume input. */
42
63
  export declare const repeat: {
43
- <A>(inner: Grammar<A>, count: Ref<number>): Grammar<ReadonlyArray<A>>;
44
- (count: Ref<number>): <A>(inner: Grammar<A>) => Grammar<ReadonlyArray<A>>;
64
+ <A>(inner: Grammar<A>, count: Ref<number> | number): Grammar<ReadonlyArray<A>>;
65
+ (count: Ref<number> | number): <A>(inner: Grammar<A>) => Grammar<ReadonlyArray<A>>;
45
66
  };
46
67
  export interface TransformOptions<A, B> {
47
68
  readonly decode: (a: A) => B;
@@ -49,6 +70,11 @@ export interface TransformOptions<A, B> {
49
70
  readonly is?: (value: B) => boolean;
50
71
  readonly name?: string;
51
72
  }
73
+ /**
74
+ * Map a grammar's value with a pair of functions. No law is claimed: the
75
+ * two directions need not be inverse, so a value may print as text that
76
+ * parses back to something else. Use `iso` when you mean to claim inverses.
77
+ */
52
78
  export declare const transform: {
53
79
  <A, B>(options: TransformOptions<A, B>): (inner: Grammar<A>) => Grammar<B>;
54
80
  <A, B>(inner: Grammar<A>, options: TransformOptions<A, B>): Grammar<B>;
@@ -59,10 +85,31 @@ export interface TransformOrFailOptions<A, B> {
59
85
  readonly is?: (value: B) => boolean;
60
86
  readonly name?: string;
61
87
  }
88
+ /** {@link transform} with directions that return a `Result`. No law is claimed. */
62
89
  export declare const transformOrFail: {
63
90
  <A, B>(options: TransformOrFailOptions<A, B>): (inner: Grammar<A>) => Grammar<B>;
64
91
  <A, B>(inner: Grammar<A>, options: TransformOrFailOptions<A, B>): Grammar<B>;
65
92
  };
93
+ /**
94
+ * Like {@link transform}, but the author claims the two directions are
95
+ * inverse. The claim is recorded, not proved; `Grammar.auditFidelity` reports
96
+ * only the transforms that make no such claim.
97
+ */
98
+ export declare const iso: {
99
+ <A, B>(options: TransformOptions<A, B>): (inner: Grammar<A>) => Grammar<B>;
100
+ <A, B>(inner: Grammar<A>, options: TransformOptions<A, B>): Grammar<B>;
101
+ };
102
+ /** An {@link iso} whose two directions may each fail; they must agree where both succeed. */
103
+ export declare const partialIso: {
104
+ <A, B>(options: TransformOrFailOptions<A, B>): (inner: Grammar<A>) => Grammar<B>;
105
+ <A, B>(inner: Grammar<A>, options: TransformOrFailOptions<A, B>): Grammar<B>;
106
+ };
107
+ export declare const filter: {
108
+ <A, B extends A>(refinement: (value: A) => value is B, name: string): (inner: Grammar<A>) => Grammar<B>;
109
+ <A>(predicate: (value: A) => boolean, name: string): (inner: Grammar<A>) => Grammar<A>;
110
+ <A, B extends A>(inner: Grammar<A>, refinement: (value: A) => value is B, name: string): Grammar<B>;
111
+ <A>(inner: Grammar<A>, predicate: (value: A) => boolean, name: string): Grammar<A>;
112
+ };
66
113
  export interface DecodeToOptions<A, T> extends Omit<TransformOptions<A, T>, "is"> {
67
114
  readonly is?: ((value: T) => boolean) | undefined;
68
115
  }
@@ -71,6 +118,12 @@ export declare const as: {
71
118
  <const V>(value: V): (inner: Silent) => Grammar<V>;
72
119
  <const V>(inner: Silent, value: V): Grammar<V>;
73
120
  };
121
+ /**
122
+ * String alternatives whose value is the matched string. Longer strings are
123
+ * tried first whatever order they are listed in, so a string is never shadowed
124
+ * by one of its own prefixes; strings of equal length keep their listed order.
125
+ */
126
+ export declare const literals: <const Values extends readonly [string, ...Array<string>]>(...values: Values) => Grammar<Values[number]>;
74
127
  export declare const flag: (value: Silent | string) => Grammar<boolean>;
75
128
  export declare const skip: {
76
129
  <A>(printAs: A): (inner: Grammar<A>) => Silent;
@@ -80,7 +133,18 @@ export declare const label: {
80
133
  (name: string): <A>(inner: Grammar<A>) => Grammar<A>;
81
134
  <A>(inner: Grammar<A>, name: string): Grammar<A>;
82
135
  };
136
+ /**
137
+ * Defer a grammar for recursive definitions. The thunk runs on first resolution
138
+ * and its result is cached. Parsing rejects recursion at the same input position;
139
+ * printing rejects recursion that reaches the same suspension without consuming
140
+ * a value, so recursive definitions must be productive.
141
+ */
83
142
  export declare const suspend: <A>(thunk: () => Grammar<A>, name?: string) => Grammar<A>;
143
+ /**
144
+ * Replace an absent (`undefined`) inner value when parsing, and omit a value
145
+ * equal to the default when printing. Parsing leaves every other value,
146
+ * including `null`, unchanged.
147
+ */
84
148
  export declare const defaulted: {
85
149
  <A>(value: A): (inner: Grammar<A | undefined>) => Grammar<A>;
86
150
  <A>(inner: Grammar<A | undefined>, value: A): Grammar<A>;
@@ -89,17 +153,59 @@ type StructFields = Readonly<Record<string, GrammarInternal>>;
89
153
  type StructValue<Fields extends StructFields> = {
90
154
  readonly [K in keyof Fields]: Type<Fields[K]>;
91
155
  };
156
+ /**
157
+ * Sequence fields and return an object. Printing requires exactly these own
158
+ * keys: missing, extra, and symbol keys are rejected.
159
+ */
92
160
  export declare const struct: <const Fields extends StructFields>(fields: Fields) => Grammar<StructValue<Fields>>;
161
+ export declare const withKeys: <A>(grammar: Grammar<A>, keys: ReadonlyArray<string> | undefined) => Grammar<A>;
162
+ type MergeValue<Parts extends ReadonlyArray<GrammarInternal>> = Types.UnionToIntersection<{
163
+ [K in keyof Parts]: {
164
+ readonly value: Type<Parts[K]>;
165
+ };
166
+ }[number]> extends {
167
+ readonly value: infer Value;
168
+ } ? Types.Simplify<Value> : never;
169
+ export declare const merge: <const Parts extends readonly [GrammarInternal, ...Array<GrammarInternal>]>(...grammars: Parts) => Grammar<MergeValue<Parts>>;
170
+ export declare const prefixedBy: (length: Grammar<number>, take: (length: Ref<number>) => Grammar<string>) => Grammar<string>;
171
+ export declare const lengthPrefixed: (length: Grammar<number>) => Grammar<string>;
172
+ export declare const countPrefixed: {
173
+ <A>(item: Grammar<A>, count: Grammar<number>): Grammar<ReadonlyArray<A>>;
174
+ (count: Grammar<number>): <A>(item: Grammar<A>) => Grammar<ReadonlyArray<A>>;
175
+ };
93
176
  type TupleValue<Elements extends ReadonlyArray<GrammarInternal>> = {
94
177
  readonly [K in keyof Elements]: Type<Elements[K]>;
95
178
  };
96
179
  export declare const tuple: <const Elements extends ReadonlyArray<GrammarInternal>>(...elements: Elements) => Grammar<TupleValue<Elements>>;
180
+ type OnCases<Tag extends string, Cases extends Readonly<Record<string, GrammarInternal>>> = {
181
+ readonly [K in keyof Cases & string]: Type<Cases[K]> extends Readonly<Record<Tag, K>> ? Cases[K] : Grammar<Readonly<Record<Tag, K>>>;
182
+ };
183
+ type OnEntries<Tag extends string, Entries extends ReadonlyArray<readonly [MatchKey, GrammarInternal]>> = {
184
+ readonly [I in keyof Entries]: Entries[I] extends readonly [infer K extends MatchKey, unknown] ? Type<Entries[I][1]> extends Readonly<Record<Tag, K>> ? Entries[I] : readonly [K, Grammar<Readonly<Record<Tag, K>>>] : never;
185
+ };
186
+ /**
187
+ * Alternatives dispatched by a discriminant field. Parsing tries the branches
188
+ * in order; printing reads `value[tag]` and prints with the branch of that key,
189
+ * so it never picks the wrong printer. It does not remove parse ambiguity: two
190
+ * branches may still parse the same text.
191
+ *
192
+ * The cases are an object keyed by the tag's string values. Integer-like keys
193
+ * are rejected, since JavaScript reorders them; use `choiceOnEntries` for
194
+ * those, and for number or boolean discriminants.
195
+ */
196
+ export declare const choiceOn: <const Tag extends string, const Cases extends Readonly<Record<string, GrammarInternal>>>(tag: Tag, cases: Cases & OnCases<Tag, Cases>) => Grammar<Type<Cases[keyof Cases]>>;
197
+ /**
198
+ * `choiceOn` with the cases as an array of `[key, grammar]` entries: the parse
199
+ * order is the array order, and keys may be numbers or booleans as well as
200
+ * strings.
201
+ */
202
+ export declare const choiceOnEntries: <const Tag extends string, const Entries extends ReadonlyArray<readonly [MatchKey, GrammarInternal]>>(tag: Tag, entries: Entries & OnEntries<Tag, Entries>) => Grammar<Type<Entries[number][1]>>;
97
203
  type TaggedValue<Tag extends string, Cases extends Readonly<Record<string, GrammarInternal>>> = {
98
204
  readonly [K in keyof Cases & string]: Readonly<Record<Tag, K>> & {
99
205
  readonly value: Type<Cases[K]>;
100
206
  };
101
207
  }[keyof Cases & string];
102
- export declare const taggedChoice: <const Tag extends string, const Cases extends Readonly<Record<string, GrammarInternal>>>(tag: Tag, cases: Cases) => Grammar<TaggedValue<Tag, Cases>>;
208
+ export declare const taggedChoice: <const Tag extends string, const Cases extends Readonly<Record<string, GrammarInternal>>>(tag: Tag extends "value" ? never : Tag, cases: Cases) => Grammar<TaggedValue<Tag, Cases>>;
103
209
  export declare const trivia: Silent;
104
210
  export declare const space: Silent;
105
211
  export declare const spaces: Silent;
@@ -1 +1 @@
1
- {"version":3,"file":"combinators.d.ts","sourceRoot":"","sources":["../src/combinators.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"combinators.d.ts","sourceRoot":"","sources":["../src/combinators.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,21 @@
1
1
  import { Equal, Function as F, Predicate, Result, Schema } from "effect";
2
- import { isGrammar, isSilent, make, silent, } from "./core.js";
2
+ import { isGrammar, isSilent, make, nodeOf, silent, } from "./core.js";
3
3
  import { isCount } from "./env.js";
4
4
  import { exceptionMessage, preview } from "./errors.js";
5
- import { assertInScope } from "./gen.js";
5
+ import { assertInScope, gen } from "./gen.js";
6
+ import { describe } from "./render.js";
6
7
  export { gen, get, seq } from "./gen.js";
7
8
  export const literal = (value) => silent({ _tag: "Literal", value });
8
9
  export const empty = literal("");
10
+ /**
11
+ * Match at the parser's current cursor using JavaScript `RegExp` semantics.
12
+ * Parsing uses a fresh sticky matcher against the original full input; printing
13
+ * requires the supplied string to match in full. `g`, `y`, and the caller's
14
+ * `lastIndex` are ignored, and the caller's expression is never mutated.
15
+ */
9
16
  export const regex = (expression, name) => {
10
17
  const flags = expression.flags.replace(/[gy]/g, "");
11
- return make({ _tag: "Regex", re: new RegExp(expression.source, `${flags}y`), name });
18
+ return make({ _tag: "Regex", source: expression.source, flags, name });
12
19
  };
13
20
  const toSilent = (value) => Predicate.isString(value) ? literal(value) : value;
14
21
  const preserveSilence = (inner, node) => {
@@ -31,7 +38,6 @@ export function between(open, innerOrClose, close) {
31
38
  close: toSilent(close),
32
39
  });
33
40
  }
34
- export const wrap = between;
35
41
  export function prefix(open, inner) {
36
42
  return inner === undefined
37
43
  ? (value) => between(open, value, empty)
@@ -45,7 +51,19 @@ export function suffix(innerOrClose, close) {
45
51
  // SAFETY: the two-argument overload requires a Grammar as its first argument.
46
52
  return between(empty, innerOrClose, close);
47
53
  }
54
+ /**
55
+ * Ordered alternatives. Parsing tries each branch in order and keeps the
56
+ * first that matches. Printing keeps the first branch whose printer accepts
57
+ * the value; use `checkedChoice` to keep the first branch whose text also
58
+ * parses back.
59
+ */
48
60
  export const choice = (...options) => make({ _tag: "Choice", options });
61
+ /**
62
+ * {@link choice} whose printer selects the first branch that reads back to an
63
+ * equal value. Each checked choice reparses its candidate output; nesting can
64
+ * multiply that work, so keep it off hot paths.
65
+ */
66
+ export const checkedChoice = (...options) => make({ _tag: "Choice", options, checked: true });
49
67
  export function optional(inner) {
50
68
  if (inner === undefined)
51
69
  return (value) => optional(value);
@@ -63,7 +81,9 @@ const bounds = (name, options) => {
63
81
  };
64
82
  const dataFirst = (args) => isGrammar(args[0]);
65
83
  const repeatNode = (name, inner, separator, options) => make({ _tag: "Many", inner, sep: separator, ...bounds(name, options) });
84
+ /** Repeat an item within bounds. Each successful parse must consume input. */
66
85
  export const many = F.dual(dataFirst, (inner, options) => repeatNode("many", inner, empty, options));
86
+ /** Repeat an item with a silent separator. Each successful item parse must consume input. */
67
87
  export const sepBy = F.dual(dataFirst, (inner, separator, options) => repeatNode("sepBy", inner, toSilent(separator), options));
68
88
  export const match = (scrutinee, cases) => make({
69
89
  _tag: "Match",
@@ -71,13 +91,26 @@ export const match = (scrutinee, cases) => make({
71
91
  // SAFETY: Object.keys returns only keys from the closed Cases record.
72
92
  cases: Object.keys(cases).map((key) => ({ key, grammar: cases[key] })),
73
93
  });
94
+ const uniqueCases = (entries) => {
95
+ assertUniqueKeys(entries.map(([key]) => key), "matchValue");
96
+ return entries.map(([key, grammar]) => ({ key, grammar }));
97
+ };
74
98
  export const matchValue = (scrutinee, entries) => make({
75
99
  _tag: "Match",
76
100
  scrutinee: assertInScope(scrutinee, "matchValue"),
77
- cases: entries.map(([key, grammar]) => ({ key, grammar })),
101
+ cases: uniqueCases(entries),
78
102
  });
79
- export const take = (count) => make({ _tag: "Take", count: assertInScope(count, "take") });
80
- export const repeat = F.dual(dataFirst, (inner, count) => make({ _tag: "RepeatExact", count: assertInScope(count, "repeat"), inner }));
103
+ const countExpr = (count, where) => {
104
+ if (!Predicate.isNumber(count))
105
+ return assertInScope(count, where);
106
+ if (!isCount(count))
107
+ throw new RangeError(`${where}: count must be a non-negative safe integer`);
108
+ return { _tag: "Count", value: count };
109
+ };
110
+ export const take = (count) => make({ _tag: "Take", count: countExpr(count, "take"), unit: "char" });
111
+ export const takeBytes = (count, name) => make({ _tag: "Take", count: countExpr(count, "bytes"), unit: "byte", name });
112
+ /** Repeat an item a constant or bound number of times. Each successful parse must consume input. */
113
+ export const repeat = F.dual(dataFirst, (inner, count) => make({ _tag: "RepeatExact", count: countExpr(count, "repeat"), inner }));
81
114
  const attempt = (decode) => (a) => {
82
115
  try {
83
116
  return Result.succeed(decode(a));
@@ -86,36 +119,81 @@ const attempt = (decode) => (a) => {
86
119
  return Result.fail({ message: exceptionMessage(error) });
87
120
  }
88
121
  };
89
- export const transform = F.dual(2, (inner, options) => make({
122
+ const plainTransform = (inner, options, fidelity, total) => make({
90
123
  _tag: "Transform",
91
124
  inner,
92
125
  decode: attempt(options.decode),
93
126
  encode: attempt(options.encode),
94
127
  is: options.is,
95
128
  name: options.name,
96
- }));
97
- export const transformOrFail = F.dual(2, (inner, options) => make({ _tag: "Transform", inner, ...options }));
129
+ fidelity,
130
+ total,
131
+ });
132
+ const resultTransform = (inner, options, fidelity) => make({ _tag: "Transform", inner, ...options, fidelity });
133
+ /**
134
+ * Map a grammar's value with a pair of functions. No law is claimed: the
135
+ * two directions need not be inverse, so a value may print as text that
136
+ * parses back to something else. Use `iso` when you mean to claim inverses.
137
+ */
138
+ export const transform = F.dual(2, (inner, options) => plainTransform(inner, options, "unchecked"));
139
+ /** {@link transform} with directions that return a `Result`. No law is claimed. */
140
+ export const transformOrFail = F.dual(2, (inner, options) => resultTransform(inner, options, "unchecked"));
141
+ /**
142
+ * Like {@link transform}, but the author claims the two directions are
143
+ * inverse. The claim is recorded, not proved; `Grammar.auditFidelity` reports
144
+ * only the transforms that make no such claim.
145
+ */
146
+ export const iso = F.dual(2, (inner, options) => plainTransform(inner, options, "claimed-iso"));
147
+ /** An {@link iso} whose two directions may each fail; they must agree where both succeed. */
148
+ export const partialIso = F.dual(2, (inner, options) => resultTransform(inner, options, "partial"));
149
+ export const filter = F.dual(3, (inner, predicate, name) => withKeys(iso(inner, { decode: F.identity, encode: F.identity, is: predicate, name }), keysOf(inner)));
98
150
  export const decodeTo = (schema) => (options) => (inner) => {
99
151
  let guard;
100
- return transform(inner, {
152
+ return iso(inner, {
101
153
  ...options,
102
154
  is: options.is ?? ((value) => (guard ??= Schema.is(schema))(value)),
103
155
  });
104
156
  };
105
- export const as = F.dual(2, (inner, value) => transform(inner, {
157
+ export const as = F.dual(2, (inner, value) => plainTransform(inner, {
106
158
  decode: () => value,
107
159
  encode: () => undefined,
108
160
  is: (input) => Equal.equals(input, value),
109
161
  name: preview(value),
110
- }));
162
+ }, "claimed-iso", true));
163
+ /**
164
+ * String alternatives whose value is the matched string. Longer strings are
165
+ * tried first whatever order they are listed in, so a string is never shadowed
166
+ * by one of its own prefixes; strings of equal length keep their listed order.
167
+ */
168
+ export const literals = (...values) => {
169
+ if (values.length === 0)
170
+ throw new RangeError("literals: at least one value is required");
171
+ const longestFirst = values.toSorted((left, right) => right.length - left.length);
172
+ return make({ _tag: "Choice", options: longestFirst.map((value) => as(literal(value), value)) });
173
+ };
111
174
  export const flag = (value) => choice(as(toSilent(value), true), as(empty, false));
112
175
  export const skip = F.dual(2, (inner, printAs) => silent({ _tag: "Skip", inner, printAs, show: true }));
113
176
  export const label = F.dual(2, (inner, name) => make({ _tag: "Label", inner, name }));
177
+ /**
178
+ * Defer a grammar for recursive definitions. The thunk runs on first resolution
179
+ * and its result is cached. Parsing rejects recursion at the same input position;
180
+ * printing rejects recursion that reaches the same suspension without consuming
181
+ * a value, so recursive definitions must be productive.
182
+ */
114
183
  export const suspend = (thunk, name) => make({ _tag: "Suspend", thunk, name });
115
- export const defaulted = F.dual(dataFirst, (inner, value) => transform(inner, {
116
- decode: (input) => input ?? value,
184
+ /**
185
+ * Replace an absent (`undefined`) inner value when parsing, and omit a value
186
+ * equal to the default when printing. Parsing leaves every other value,
187
+ * including `null`, unchanged.
188
+ */
189
+ export const defaulted = F.dual(dataFirst, (inner, value) => iso(inner, {
190
+ decode: (input) => (input === undefined ? value : input),
117
191
  encode: (input) => (Equal.equals(input, value) ? undefined : input),
118
192
  }));
193
+ /**
194
+ * Sequence fields and return an object. Printing requires exactly these own
195
+ * keys: missing, extra, and symbol keys are rejected.
196
+ */
119
197
  export const struct = (fields) => {
120
198
  const scope = { _tag: "ScopeId" };
121
199
  const entries = Object.entries(fields);
@@ -130,6 +208,54 @@ export const struct = (fields) => {
130
208
  },
131
209
  });
132
210
  };
211
+ const keysOf = (grammar) => {
212
+ const node = nodeOf(grammar);
213
+ switch (node._tag) {
214
+ case "Gen":
215
+ return node.result._tag === "Object" ? node.result.fields.map(([key]) => key) : undefined;
216
+ case "Transform":
217
+ return node.keys;
218
+ case "Merge":
219
+ return node.parts.flatMap((part) => part.keys);
220
+ case "Wrap":
221
+ case "Label":
222
+ return keysOf(node.inner);
223
+ default:
224
+ return undefined;
225
+ }
226
+ };
227
+ export const withKeys = (grammar, keys) => {
228
+ const node = nodeOf(grammar);
229
+ return keys === undefined || node._tag !== "Transform" ? grammar : make({ ...node, keys });
230
+ };
231
+ export const merge = (...grammars) => {
232
+ const parts = grammars.map((grammar, index) => {
233
+ const keys = keysOf(grammar);
234
+ if (keys === undefined) {
235
+ throw new TypeError(`merge: part ${index + 1} (${describe(grammar)}) has no known fields; pass a struct, a gen that returns an object, another merge, or Binary.bits`);
236
+ }
237
+ return { grammar, keys };
238
+ });
239
+ assertUniqueKeys(parts.flatMap((part) => part.keys), "merge");
240
+ return make({ _tag: "Merge", parts });
241
+ };
242
+ export const prefixedBy = (length, take) => gen(function* () {
243
+ const size = yield* length;
244
+ const body = yield* take(size);
245
+ return { size, body };
246
+ }).pipe(iso({
247
+ decode: ({ body }) => body,
248
+ encode: (body) => ({ size: body.length, body }),
249
+ }));
250
+ export const lengthPrefixed = (length) => prefixedBy(length, take);
251
+ export const countPrefixed = F.dual(2, (item, count) => gen(function* () {
252
+ const size = yield* count;
253
+ const items = yield* repeat(item, size);
254
+ return { size, items };
255
+ }).pipe(iso({
256
+ decode: ({ items }) => items,
257
+ encode: (items) => ({ size: items.length, items }),
258
+ })));
133
259
  export const tuple = (...elements) => {
134
260
  const scope = { _tag: "ScopeId" };
135
261
  return make({
@@ -143,22 +269,86 @@ export const tuple = (...elements) => {
143
269
  },
144
270
  });
145
271
  };
272
+ const isArrayIndexKey = (key) => {
273
+ const index = Number(key);
274
+ return Number.isInteger(index) && index >= 0 && index < 4_294_967_295 && String(index) === key;
275
+ };
276
+ const assertUniqueKeys = (keys, where) => {
277
+ const seen = new Set();
278
+ for (const key of keys) {
279
+ if (seen.has(key))
280
+ throw new RangeError(`${where}: duplicate key ${preview(key)}`);
281
+ seen.add(key);
282
+ }
283
+ };
284
+ const dispatchedChoice = (tag, entries, where) => {
285
+ if (entries.length === 0)
286
+ throw new RangeError(`${where}: at least one case is required`);
287
+ const keys = entries.map(([key]) => key);
288
+ assertUniqueKeys(keys, where);
289
+ return make({
290
+ _tag: "Choice",
291
+ options: entries.map(([, grammar]) => grammar),
292
+ on: { tag, keys },
293
+ });
294
+ };
295
+ /**
296
+ * Alternatives dispatched by a discriminant field. Parsing tries the branches
297
+ * in order; printing reads `value[tag]` and prints with the branch of that key,
298
+ * so it never picks the wrong printer. It does not remove parse ambiguity: two
299
+ * branches may still parse the same text.
300
+ *
301
+ * The cases are an object keyed by the tag's string values. Integer-like keys
302
+ * are rejected, since JavaScript reorders them; use `choiceOnEntries` for
303
+ * those, and for number or boolean discriminants.
304
+ */
305
+ export const choiceOn = (tag, cases) => {
306
+ const entries = Object.keys(cases).map((key) => {
307
+ if (isArrayIndexKey(key)) {
308
+ throw new RangeError(`choiceOn: key ${JSON.stringify(key)} looks like an integer; JavaScript reorders such keys, so parse order would not match the source. Use choiceOnEntries instead.`);
309
+ }
310
+ return [key, cases[key]];
311
+ });
312
+ return dispatchedChoice(tag, entries, "choiceOn");
313
+ };
314
+ /**
315
+ * `choiceOn` with the cases as an array of `[key, grammar]` entries: the parse
316
+ * order is the array order, and keys may be numbers or booleans as well as
317
+ * strings.
318
+ */
319
+ export const choiceOnEntries = (tag, entries) => dispatchedChoice(tag, entries, "choiceOnEntries");
146
320
  export const taggedChoice = (tag, cases) => {
147
- const branches = Object.entries(cases).map(([key, grammar]) => make({
148
- _tag: "Transform",
149
- inner: grammar,
321
+ if (tag === "value")
322
+ throw new RangeError('taggedChoice: tag name "value" is reserved');
323
+ const keys = Object.keys(cases);
324
+ if (keys.length === 0)
325
+ throw new RangeError("taggedChoice: at least one case is required");
326
+ for (const key of keys) {
327
+ if (isArrayIndexKey(key)) {
328
+ throw new RangeError(`taggedChoice: key ${JSON.stringify(key)} is an array index; JavaScript reorders such keys, so parse order would not match the source`);
329
+ }
330
+ if (!isGrammar(cases[key])) {
331
+ throw new TypeError(`taggedChoice: case ${JSON.stringify(key)} must be a grammar`);
332
+ }
333
+ }
334
+ const branches = keys.map((key) => resultTransform(
335
+ // SAFETY: taggedChoice's Cases constraint and the runtime check above require grammars.
336
+ cases[key], {
150
337
  decode: (value) => Result.succeed({ [tag]: key, value }),
151
- encode: (value) => Result.succeed(Object(value).value),
152
- is: (value) => {
153
- if (!Predicate.isObject(value) || !Object.hasOwn(value, tag))
154
- return false;
155
- return Object.is(value[tag], key) && Object.hasOwn(value, "value");
338
+ encode: (value) => {
339
+ if (!Predicate.isObject(value) || !Object.hasOwn(value, tag) || value[tag] !== key) {
340
+ return Result.fail({
341
+ message: `expected an object with ${tag} equal to ${preview(key)}`,
342
+ });
343
+ }
344
+ if (!Object.hasOwn(value, "value")) {
345
+ return Result.fail({ message: "expected an object with a value field" });
346
+ }
347
+ return Result.succeed(value.value);
156
348
  },
157
349
  name: `${tag}=${preview(key)}`,
158
- }));
159
- if (branches.length === 0)
160
- throw new RangeError("taggedChoice: at least one case is required");
161
- return make({ _tag: "Choice", options: branches });
350
+ }, "claimed-iso"));
351
+ return make({ _tag: "Choice", options: branches, on: { tag, keys } });
162
352
  };
163
353
  const hiddenWhitespace = (expression, name, printAs) => silent({ _tag: "Skip", inner: regex(expression, name), printAs, show: false });
164
354
  export const trivia = hiddenWhitespace(/\s*/, "trivia", "");
@@ -168,7 +358,7 @@ export function lexeme(inner) {
168
358
  return suffix(inner, trivia);
169
359
  }
170
360
  export const symbol = (value) => lexeme(literal(value));
171
- export const integer = regex(/-?\d+/, "integer").pipe(transform({
361
+ export const integer = regex(/-?\d+/, "integer").pipe(iso({
172
362
  decode: (text) => {
173
363
  const value = Number(text);
174
364
  return Object.is(value, -0) ? 0 : value;