@hegeldev/hegel 0.1.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 (144) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +59 -0
  3. package/dist/binary.d.ts +27 -0
  4. package/dist/binary.d.ts.map +1 -0
  5. package/dist/binary.js +50 -0
  6. package/dist/binary.js.map +1 -0
  7. package/dist/collections.d.ts +114 -0
  8. package/dist/collections.d.ts.map +1 -0
  9. package/dist/collections.js +313 -0
  10. package/dist/collections.js.map +1 -0
  11. package/dist/combinators.d.ts +34 -0
  12. package/dist/combinators.d.ts.map +1 -0
  13. package/dist/combinators.js +152 -0
  14. package/dist/combinators.js.map +1 -0
  15. package/dist/conformance.d.ts +31 -0
  16. package/dist/conformance.d.ts.map +1 -0
  17. package/dist/conformance.js +60 -0
  18. package/dist/conformance.js.map +1 -0
  19. package/dist/connection.d.ts +82 -0
  20. package/dist/connection.d.ts.map +1 -0
  21. package/dist/connection.js +231 -0
  22. package/dist/connection.js.map +1 -0
  23. package/dist/crc32.d.ts +13 -0
  24. package/dist/crc32.d.ts.map +1 -0
  25. package/dist/crc32.js +30 -0
  26. package/dist/crc32.js.map +1 -0
  27. package/dist/derive.d.ts +225 -0
  28. package/dist/derive.d.ts.map +1 -0
  29. package/dist/derive.js +296 -0
  30. package/dist/derive.js.map +1 -0
  31. package/dist/embedded.d.ts +38 -0
  32. package/dist/embedded.d.ts.map +1 -0
  33. package/dist/embedded.js +237 -0
  34. package/dist/embedded.js.map +1 -0
  35. package/dist/floats.d.ts +57 -0
  36. package/dist/floats.d.ts.map +1 -0
  37. package/dist/floats.js +100 -0
  38. package/dist/floats.js.map +1 -0
  39. package/dist/formats.d.ts +62 -0
  40. package/dist/formats.d.ts.map +1 -0
  41. package/dist/formats.js +164 -0
  42. package/dist/formats.js.map +1 -0
  43. package/dist/generator.d.ts +80 -0
  44. package/dist/generator.d.ts.map +1 -0
  45. package/dist/generator.js +128 -0
  46. package/dist/generator.js.map +1 -0
  47. package/dist/generators/collections.d.ts +20 -0
  48. package/dist/generators/collections.d.ts.map +1 -0
  49. package/dist/generators/collections.js +209 -0
  50. package/dist/generators/collections.js.map +1 -0
  51. package/dist/generators/combinators.d.ts +15 -0
  52. package/dist/generators/combinators.d.ts.map +1 -0
  53. package/dist/generators/combinators.js +143 -0
  54. package/dist/generators/combinators.js.map +1 -0
  55. package/dist/generators/compose.d.ts +27 -0
  56. package/dist/generators/compose.d.ts.map +1 -0
  57. package/dist/generators/compose.js +82 -0
  58. package/dist/generators/compose.js.map +1 -0
  59. package/dist/generators/core.d.ts +53 -0
  60. package/dist/generators/core.d.ts.map +1 -0
  61. package/dist/generators/core.js +134 -0
  62. package/dist/generators/core.js.map +1 -0
  63. package/dist/generators/index.d.ts +18 -0
  64. package/dist/generators/index.d.ts.map +1 -0
  65. package/dist/generators/index.js +15 -0
  66. package/dist/generators/index.js.map +1 -0
  67. package/dist/generators/numeric.d.ts +40 -0
  68. package/dist/generators/numeric.d.ts.map +1 -0
  69. package/dist/generators/numeric.js +128 -0
  70. package/dist/generators/numeric.js.map +1 -0
  71. package/dist/generators/primitives.d.ts +138 -0
  72. package/dist/generators/primitives.d.ts.map +1 -0
  73. package/dist/generators/primitives.js +240 -0
  74. package/dist/generators/primitives.js.map +1 -0
  75. package/dist/generators/strings.d.ts +73 -0
  76. package/dist/generators/strings.d.ts.map +1 -0
  77. package/dist/generators/strings.js +215 -0
  78. package/dist/generators/strings.js.map +1 -0
  79. package/dist/generators/tuples.d.ts +11 -0
  80. package/dist/generators/tuples.d.ts.map +1 -0
  81. package/dist/generators/tuples.js +43 -0
  82. package/dist/generators/tuples.js.map +1 -0
  83. package/dist/generators.d.ts +408 -0
  84. package/dist/generators.d.ts.map +1 -0
  85. package/dist/generators.js +898 -0
  86. package/dist/generators.js.map +1 -0
  87. package/dist/index.d.ts +16 -0
  88. package/dist/index.d.ts.map +1 -0
  89. package/dist/index.js +13 -0
  90. package/dist/index.js.map +1 -0
  91. package/dist/install.d.ts +6 -0
  92. package/dist/install.d.ts.map +1 -0
  93. package/dist/install.js +91 -0
  94. package/dist/install.js.map +1 -0
  95. package/dist/integers.d.ts +37 -0
  96. package/dist/integers.d.ts.map +1 -0
  97. package/dist/integers.js +63 -0
  98. package/dist/integers.js.map +1 -0
  99. package/dist/labels.d.ts +21 -0
  100. package/dist/labels.d.ts.map +1 -0
  101. package/dist/labels.js +20 -0
  102. package/dist/labels.js.map +1 -0
  103. package/dist/objects.d.ts +39 -0
  104. package/dist/objects.d.ts.map +1 -0
  105. package/dist/objects.js +98 -0
  106. package/dist/objects.js.map +1 -0
  107. package/dist/primitives.d.ts +14 -0
  108. package/dist/primitives.d.ts.map +1 -0
  109. package/dist/primitives.js +51 -0
  110. package/dist/primitives.js.map +1 -0
  111. package/dist/protocol.d.ts +25 -0
  112. package/dist/protocol.d.ts.map +1 -0
  113. package/dist/protocol.js +77 -0
  114. package/dist/protocol.js.map +1 -0
  115. package/dist/runner.d.ts +115 -0
  116. package/dist/runner.d.ts.map +1 -0
  117. package/dist/runner.js +455 -0
  118. package/dist/runner.js.map +1 -0
  119. package/dist/session.d.ts +19 -0
  120. package/dist/session.d.ts.map +1 -0
  121. package/dist/session.js +157 -0
  122. package/dist/session.js.map +1 -0
  123. package/dist/spans.d.ts +23 -0
  124. package/dist/spans.d.ts.map +1 -0
  125. package/dist/spans.js +51 -0
  126. package/dist/spans.js.map +1 -0
  127. package/dist/strings.d.ts +67 -0
  128. package/dist/strings.d.ts.map +1 -0
  129. package/dist/strings.js +107 -0
  130. package/dist/strings.js.map +1 -0
  131. package/dist/testCase.d.ts +118 -0
  132. package/dist/testCase.d.ts.map +1 -0
  133. package/dist/testCase.js +186 -0
  134. package/dist/testCase.js.map +1 -0
  135. package/dist/uv-install.sh +2226 -0
  136. package/dist/uv.d.ts +20 -0
  137. package/dist/uv.d.ts.map +1 -0
  138. package/dist/uv.js +103 -0
  139. package/dist/uv.js.map +1 -0
  140. package/dist/wtf8.d.ts +16 -0
  141. package/dist/wtf8.d.ts.map +1 -0
  142. package/dist/wtf8.js +52 -0
  143. package/dist/wtf8.js.map +1 -0
  144. package/package.json +60 -0
@@ -0,0 +1,80 @@
1
+ /**
2
+ * JSON Schema type for generator schemas.
3
+ */
4
+ export type JsonSchema = Record<string, unknown>;
5
+ /**
6
+ * Core Generator interface.
7
+ * All generators implement this interface.
8
+ */
9
+ export interface Generator<T> {
10
+ /**
11
+ * Generate a value of type T.
12
+ */
13
+ generate(): T;
14
+ /**
15
+ * Get the JSON Schema for this generator, or null if unavailable.
16
+ * When a schema is available, generation is more efficient (single socket round-trip).
17
+ */
18
+ schema(): JsonSchema | null;
19
+ /**
20
+ * Transform generated values with a function.
21
+ * Note: This invalidates the schema, causing compositional generation.
22
+ */
23
+ map<U>(f: (value: T) => U): Generator<U>;
24
+ /**
25
+ * Dependent generation where the next generator depends on the generated value.
26
+ * Note: This invalidates the schema, causing compositional generation.
27
+ */
28
+ flatMap<U>(f: (value: T) => Generator<U>): Generator<U>;
29
+ /**
30
+ * Filter generated values by a predicate.
31
+ * Note: This invalidates the schema, causing compositional generation.
32
+ * @param predicate - Function that returns true for valid values
33
+ */
34
+ filter(predicate: (value: T) => boolean): Generator<T>;
35
+ }
36
+ /**
37
+ * Abstract base class providing default implementations of map, flatMap, and filter.
38
+ * Concrete generators only need to implement generate() and schema().
39
+ */
40
+ export declare abstract class BaseGenerator<T> implements Generator<T> {
41
+ abstract generate(): T;
42
+ abstract schema(): JsonSchema | null;
43
+ map<U>(f: (value: T) => U): Generator<U>;
44
+ flatMap<U>(f: (value: T) => Generator<U>): Generator<U>;
45
+ filter(predicate: (value: T) => boolean): Generator<T>;
46
+ }
47
+ /**
48
+ * Schema-based generator that uses a JSON schema for generation.
49
+ * Provides efficient single socket round-trip generation.
50
+ */
51
+ export declare class SchemaGenerator<T> extends BaseGenerator<T> {
52
+ private readonly _schema;
53
+ constructor(_schema: JsonSchema);
54
+ generate(): T;
55
+ schema(): JsonSchema;
56
+ }
57
+ /**
58
+ * Function-based generator that wraps a generation function.
59
+ * May or may not have a schema.
60
+ */
61
+ export declare class FuncGenerator<T> extends BaseGenerator<T> {
62
+ private readonly genFn;
63
+ private readonly _schema;
64
+ constructor(genFn: () => T, _schema?: JsonSchema | null);
65
+ generate(): T;
66
+ schema(): JsonSchema | null;
67
+ }
68
+ /**
69
+ * Generator that filters values by a predicate.
70
+ * Retries up to 3 times before rejecting.
71
+ * Always has no schema.
72
+ */
73
+ export declare class FilteredGenerator<T> extends BaseGenerator<T> {
74
+ private readonly source;
75
+ private readonly predicate;
76
+ constructor(source: Generator<T>, predicate: (value: T) => boolean);
77
+ generate(): T;
78
+ schema(): null;
79
+ }
80
+ //# sourceMappingURL=generator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.d.ts","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"AAIA;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;AAEhD;;;GAGG;AACH,MAAM,WAAW,SAAS,CAAC,CAAC;IAC1B;;OAEG;IACH,QAAQ,IAAI,CAAC,CAAA;IAEb;;;OAGG;IACH,MAAM,IAAI,UAAU,GAAG,IAAI,CAAA;IAE3B;;;OAGG;IACH,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAExC;;;OAGG;IACH,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;IAEvD;;;;OAIG;IACH,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC,CAAA;CACvD;AAED;;;GAGG;AACH,8BAAsB,aAAa,CAAC,CAAC,CAAE,YAAW,SAAS,CAAC,CAAC,CAAC;IAC5D,QAAQ,CAAC,QAAQ,IAAI,CAAC;IACtB,QAAQ,CAAC,MAAM,IAAI,UAAU,GAAG,IAAI;IAEpC,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAIxC,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC;IAIvD,MAAM,CAAC,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO,GAAG,SAAS,CAAC,CAAC,CAAC;CAGvD;AAED;;;GAGG;AACH,qBAAa,eAAe,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,QAAQ,CAAC,OAAO;gBAAP,OAAO,EAAE,UAAU;IAIhD,QAAQ,IAAI,CAAC;IAIb,MAAM,IAAI,UAAU;CAGrB;AAED;;;GAGG;AACH,qBAAa,aAAa,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IAElD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,OAAO;gBADP,KAAK,EAAE,MAAM,CAAC,EACd,OAAO,GAAE,UAAU,GAAG,IAAW;IAKpD,QAAQ,IAAI,CAAC;IAIb,MAAM,IAAI,UAAU,GAAG,IAAI;CAG5B;AAiDD;;;;GAIG;AACH,qBAAa,iBAAiB,CAAC,CAAC,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IAEtD,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,SAAS;gBADT,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,SAAS,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,OAAO;IAKnD,QAAQ,IAAI,CAAC;IAgBb,MAAM,IAAI,IAAI;CAGf"}
@@ -0,0 +1,128 @@
1
+ import { generateFromSchema, assume } from "./connection.js";
2
+ import { LABELS } from "./labels.js";
3
+ import { discardableGroup, group } from "./spans.js";
4
+ /**
5
+ * Abstract base class providing default implementations of map, flatMap, and filter.
6
+ * Concrete generators only need to implement generate() and schema().
7
+ */
8
+ export class BaseGenerator {
9
+ map(f) {
10
+ return new MappedGenerator(this, f);
11
+ }
12
+ flatMap(f) {
13
+ return new FlatMappedGenerator(this, f);
14
+ }
15
+ filter(predicate) {
16
+ return new FilteredGenerator(this, predicate);
17
+ }
18
+ }
19
+ /**
20
+ * Schema-based generator that uses a JSON schema for generation.
21
+ * Provides efficient single socket round-trip generation.
22
+ */
23
+ export class SchemaGenerator extends BaseGenerator {
24
+ _schema;
25
+ constructor(_schema) {
26
+ super();
27
+ this._schema = _schema;
28
+ }
29
+ generate() {
30
+ return generateFromSchema(this._schema);
31
+ }
32
+ schema() {
33
+ return this._schema;
34
+ }
35
+ }
36
+ /**
37
+ * Function-based generator that wraps a generation function.
38
+ * May or may not have a schema.
39
+ */
40
+ export class FuncGenerator extends BaseGenerator {
41
+ genFn;
42
+ _schema;
43
+ constructor(genFn, _schema = null) {
44
+ super();
45
+ this.genFn = genFn;
46
+ this._schema = _schema;
47
+ }
48
+ generate() {
49
+ return this.genFn();
50
+ }
51
+ schema() {
52
+ return this._schema;
53
+ }
54
+ }
55
+ /**
56
+ * Generator that transforms values from another generator.
57
+ * Always has no schema (transformation invalidates it).
58
+ */
59
+ class MappedGenerator extends BaseGenerator {
60
+ source;
61
+ f;
62
+ constructor(source, f) {
63
+ super();
64
+ this.source = source;
65
+ this.f = f;
66
+ }
67
+ generate() {
68
+ return this.f(this.source.generate());
69
+ }
70
+ schema() {
71
+ return null;
72
+ }
73
+ }
74
+ /**
75
+ * Generator for dependent generation.
76
+ * The next generator depends on the value from the first generator.
77
+ * Always has no schema.
78
+ */
79
+ class FlatMappedGenerator extends BaseGenerator {
80
+ source;
81
+ f;
82
+ constructor(source, f) {
83
+ super();
84
+ this.source = source;
85
+ this.f = f;
86
+ }
87
+ generate() {
88
+ return group(LABELS.FLAT_MAP, () => {
89
+ const intermediate = this.source.generate();
90
+ const nextGen = this.f(intermediate);
91
+ return nextGen.generate();
92
+ });
93
+ }
94
+ schema() {
95
+ return null;
96
+ }
97
+ }
98
+ /**
99
+ * Generator that filters values by a predicate.
100
+ * Retries up to 3 times before rejecting.
101
+ * Always has no schema.
102
+ */
103
+ export class FilteredGenerator extends BaseGenerator {
104
+ source;
105
+ predicate;
106
+ constructor(source, predicate) {
107
+ super();
108
+ this.source = source;
109
+ this.predicate = predicate;
110
+ }
111
+ generate() {
112
+ for (let i = 0; i < 3; i++) {
113
+ const result = discardableGroup(LABELS.FILTER, () => {
114
+ const value = this.source.generate();
115
+ return this.predicate(value) ? value : null;
116
+ });
117
+ if (result !== null) {
118
+ return result;
119
+ }
120
+ }
121
+ assume(false);
122
+ throw new Error("unreachable"); // assume(false) exits the process
123
+ }
124
+ schema() {
125
+ return null;
126
+ }
127
+ }
128
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Collection generators: arrays, sets, and maps.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { Generator } from "./core.js";
7
+ export interface CollectionOptions {
8
+ minSize?: number;
9
+ maxSize?: number;
10
+ }
11
+ export interface ArrayOptions extends CollectionOptions {
12
+ unique?: boolean;
13
+ }
14
+ /** Generate arrays with elements from the given generator. */
15
+ export declare function arrays<T>(elements: Generator<T>, options?: ArrayOptions): Generator<T[]>;
16
+ /** Generate Sets with elements from the given generator. */
17
+ export declare function sets<T>(elements: Generator<T>, options?: CollectionOptions): Generator<Set<T>>;
18
+ /** Generate Maps with keys and values from the given generators. */
19
+ export declare function maps<K, V>(keys: Generator<K>, values: Generator<V>, options?: CollectionOptions): Generator<Map<K, V>>;
20
+ //# sourceMappingURL=collections.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.d.ts","sourceRoot":"","sources":["../../src/generators/collections.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AAEtD,MAAM,WAAW,iBAAiB;IAChC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,YAAa,SAAQ,iBAAiB;IACrD,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAuED,8DAA8D;AAC9D,wBAAgB,MAAM,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,YAAY,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAExF;AA8DD,4DAA4D;AAC5D,wBAAgB,IAAI,CAAC,CAAC,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,iBAAiB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAE9F;AA4ED,oEAAoE;AACpE,wBAAgB,IAAI,CAAC,CAAC,EAAE,CAAC,EACvB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAClB,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,SAAS,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAEtB"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Collection generators: arrays, sets, and maps.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { Collection, Labels } from "../testCase.js";
7
+ import { Generator, BasicGenerator } from "./core.js";
8
+ // ---------------------------------------------------------------------------
9
+ // Arrays
10
+ // ---------------------------------------------------------------------------
11
+ class ArraysGenerator extends Generator {
12
+ elements;
13
+ minSize;
14
+ maxSize;
15
+ unique;
16
+ basic;
17
+ constructor(elements, options) {
18
+ super();
19
+ const minSize = options?.minSize ?? 0;
20
+ const maxSize = options?.maxSize ?? null;
21
+ const unique = options?.unique ?? false;
22
+ if (maxSize !== null && minSize > maxSize) {
23
+ throw new Error("Cannot have maxSize < minSize");
24
+ }
25
+ this.elements = elements;
26
+ this.minSize = minSize;
27
+ this.maxSize = maxSize;
28
+ this.unique = unique;
29
+ const elementBasic = elements.asBasic();
30
+ if (elementBasic) {
31
+ const schema = {
32
+ type: "list",
33
+ unique,
34
+ elements: elementBasic.schema,
35
+ min_size: minSize,
36
+ };
37
+ if (maxSize !== null)
38
+ schema["max_size"] = maxSize;
39
+ this.basic = new BasicGenerator(schema, (raw) => {
40
+ if (!Array.isArray(raw))
41
+ throw new Error(`Expected array, got ${typeof raw}`);
42
+ return raw.map((v) => elementBasic.parseRaw(v));
43
+ });
44
+ }
45
+ else {
46
+ this.basic = null;
47
+ }
48
+ }
49
+ doDraw(tc) {
50
+ if (this.basic)
51
+ return this.basic.doDraw(tc);
52
+ tc.startSpan(Labels.LIST);
53
+ const collection = new Collection(tc, this.minSize, this.maxSize ?? undefined);
54
+ const result = [];
55
+ while (collection.more()) {
56
+ const element = this.elements.doDraw(tc);
57
+ if (this.unique) {
58
+ if (result.some((existing) => JSON.stringify(existing) === JSON.stringify(element))) {
59
+ collection.reject("duplicate element");
60
+ continue;
61
+ }
62
+ }
63
+ result.push(element);
64
+ }
65
+ tc.stopSpan();
66
+ return result;
67
+ }
68
+ asBasic() {
69
+ return this.basic;
70
+ }
71
+ }
72
+ /** Generate arrays with elements from the given generator. */
73
+ export function arrays(elements, options) {
74
+ return new ArraysGenerator(elements, options);
75
+ }
76
+ class SetsGenerator extends Generator {
77
+ elements;
78
+ minSize;
79
+ maxSize;
80
+ basic;
81
+ constructor(elements, options) {
82
+ super();
83
+ const minSize = options?.minSize ?? 0;
84
+ const maxSize = options?.maxSize ?? null;
85
+ if (maxSize !== null && minSize > maxSize) {
86
+ throw new Error("Cannot have maxSize < minSize");
87
+ }
88
+ this.elements = elements;
89
+ this.minSize = minSize;
90
+ this.maxSize = maxSize;
91
+ const elementBasic = elements.asBasic();
92
+ if (elementBasic) {
93
+ const schema = {
94
+ type: "list",
95
+ unique: true,
96
+ elements: elementBasic.schema,
97
+ min_size: minSize,
98
+ };
99
+ if (maxSize !== null)
100
+ schema["max_size"] = maxSize;
101
+ this.basic = new BasicGenerator(schema, (raw) => {
102
+ if (!Array.isArray(raw))
103
+ throw new Error(`Expected array, got ${typeof raw}`);
104
+ return new Set(raw.map((v) => elementBasic.parseRaw(v)));
105
+ });
106
+ }
107
+ else {
108
+ this.basic = null;
109
+ }
110
+ }
111
+ doDraw(tc) {
112
+ if (this.basic)
113
+ return this.basic.doDraw(tc);
114
+ tc.startSpan(Labels.SET);
115
+ const collection = new Collection(tc, this.minSize, this.maxSize ?? undefined);
116
+ const result = new Set();
117
+ while (collection.more()) {
118
+ const element = this.elements.doDraw(tc);
119
+ if (result.has(element)) {
120
+ collection.reject("duplicate element");
121
+ continue;
122
+ }
123
+ result.add(element);
124
+ }
125
+ tc.stopSpan();
126
+ return result;
127
+ }
128
+ asBasic() {
129
+ return this.basic;
130
+ }
131
+ }
132
+ /** Generate Sets with elements from the given generator. */
133
+ export function sets(elements, options) {
134
+ return new SetsGenerator(elements, options);
135
+ }
136
+ class MapsGenerator extends Generator {
137
+ keys;
138
+ values;
139
+ minSize;
140
+ maxSize;
141
+ basic;
142
+ constructor(keys, values, options) {
143
+ super();
144
+ const minSize = options?.minSize ?? 0;
145
+ const maxSize = options?.maxSize ?? null;
146
+ if (maxSize !== null && minSize > maxSize) {
147
+ throw new Error("Cannot have maxSize < minSize");
148
+ }
149
+ this.keys = keys;
150
+ this.values = values;
151
+ this.minSize = minSize;
152
+ this.maxSize = maxSize;
153
+ const keyBasic = keys.asBasic();
154
+ const valueBasic = values.asBasic();
155
+ if (keyBasic && valueBasic) {
156
+ const schema = {
157
+ type: "dict",
158
+ keys: keyBasic.schema,
159
+ values: valueBasic.schema,
160
+ min_size: minSize,
161
+ };
162
+ if (maxSize !== null)
163
+ schema["max_size"] = maxSize;
164
+ this.basic = new BasicGenerator(schema, (raw) => {
165
+ if (!Array.isArray(raw))
166
+ throw new Error(`Expected array, got ${typeof raw}`);
167
+ const map = new Map();
168
+ for (const entry of raw) {
169
+ if (!Array.isArray(entry) || entry.length !== 2) {
170
+ throw new Error("Expected [key, value] pair");
171
+ }
172
+ map.set(keyBasic.parseRaw(entry[0]), valueBasic.parseRaw(entry[1]));
173
+ }
174
+ return map;
175
+ });
176
+ }
177
+ else {
178
+ this.basic = null;
179
+ }
180
+ }
181
+ doDraw(tc) {
182
+ if (this.basic)
183
+ return this.basic.doDraw(tc);
184
+ tc.startSpan(Labels.MAP);
185
+ const collection = new Collection(tc, this.minSize, this.maxSize ?? undefined);
186
+ const result = new Map();
187
+ while (collection.more()) {
188
+ tc.startSpan(Labels.MAP_ENTRY);
189
+ const key = this.keys.doDraw(tc);
190
+ const value = this.values.doDraw(tc);
191
+ tc.stopSpan();
192
+ if (result.has(key)) {
193
+ collection.reject("duplicate key");
194
+ continue;
195
+ }
196
+ result.set(key, value);
197
+ }
198
+ tc.stopSpan();
199
+ return result;
200
+ }
201
+ asBasic() {
202
+ return this.basic;
203
+ }
204
+ }
205
+ /** Generate Maps with keys and values from the given generators. */
206
+ export function maps(keys, values, options) {
207
+ return new MapsGenerator(keys, values, options);
208
+ }
209
+ //# sourceMappingURL=collections.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collections.js","sourceRoot":"","sources":["../../src/generators/collections.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAY,UAAU,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AAC9D,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,WAAW,CAAC;AAWtD,8EAA8E;AAC9E,SAAS;AACT,8EAA8E;AAE9E,MAAM,eAAmB,SAAQ,SAAc;IAC5B,QAAQ,CAAe;IACvB,OAAO,CAAS;IAChB,OAAO,CAAgB;IACvB,MAAM,CAAU;IAChB,KAAK,CAA6B;IAEnD,YAAY,QAAsB,EAAE,OAAsB;QACxD,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;QACzC,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,KAAK,CAAC;QAExC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QAErB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAA4B;gBACtC,IAAI,EAAE,MAAM;gBACZ,MAAM;gBACN,QAAQ,EAAE,YAAY,CAAC,MAAM;gBAC7B,QAAQ,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;YAEnD,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC9E,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3D,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAY;QACjB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC1B,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAQ,EAAE,CAAC;QACvB,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;gBAChB,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;oBACpF,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;oBACvC,SAAS;gBACX,CAAC;YACH,CAAC;YACD,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACvB,CAAC;QACD,EAAE,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,OAAO;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,8DAA8D;AAC9D,MAAM,UAAU,MAAM,CAAI,QAAsB,EAAE,OAAsB;IACtE,OAAO,IAAI,eAAe,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAChD,CAAC;AAED,MAAM,aAAiB,SAAQ,SAAiB;IAC7B,QAAQ,CAAe;IACvB,OAAO,CAAS;IAChB,OAAO,CAAgB;IACvB,KAAK,CAAgC;IAEtD,YAAY,QAAsB,EAAE,OAA2B;QAC7D,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;QAEzC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,EAAE,CAAC;QACxC,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,MAAM,GAA4B;gBACtC,IAAI,EAAE,MAAM;gBACZ,MAAM,EAAE,IAAI;gBACZ,QAAQ,EAAE,YAAY,CAAC,MAAM;gBAC7B,QAAQ,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;YAEnD,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC9E,OAAO,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAU,EAAE,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YACpE,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAY;QACjB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAC5B,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACzC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC;gBACxB,UAAU,CAAC,MAAM,CAAC,mBAAmB,CAAC,CAAC;gBACvC,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QACtB,CAAC;QACD,EAAE,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,OAAO;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,4DAA4D;AAC5D,MAAM,UAAU,IAAI,CAAI,QAAsB,EAAE,OAA2B;IACzE,OAAO,IAAI,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;AAC9C,CAAC;AAED,MAAM,aAAoB,SAAQ,SAAoB;IACnC,IAAI,CAAe;IACnB,MAAM,CAAe;IACrB,OAAO,CAAS;IAChB,OAAO,CAAgB;IACvB,KAAK,CAAmC;IAEzD,YAAY,IAAkB,EAAE,MAAoB,EAAE,OAA2B;QAC/E,KAAK,EAAE,CAAC;QACR,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,CAAC,CAAC;QACtC,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC;QAEzC,IAAI,OAAO,KAAK,IAAI,IAAI,OAAO,GAAG,OAAO,EAAE,CAAC;YAC1C,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACnD,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QAEvB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;QAChC,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;QAEpC,IAAI,QAAQ,IAAI,UAAU,EAAE,CAAC;YAC3B,MAAM,MAAM,GAA4B;gBACtC,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,QAAQ,CAAC,MAAM;gBACrB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,QAAQ,EAAE,OAAO;aAClB,CAAC;YACF,IAAI,OAAO,KAAK,IAAI;gBAAE,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC;YAEnD,IAAI,CAAC,KAAK,GAAG,IAAI,cAAc,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,EAAE;gBAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;oBAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,GAAG,EAAE,CAAC,CAAC;gBAC9E,MAAM,GAAG,GAAG,IAAI,GAAG,EAAQ,CAAC;gBAC5B,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;oBACxB,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;wBAChD,MAAM,IAAI,KAAK,CAAC,4BAA4B,CAAC,CAAC;oBAChD,CAAC;oBACD,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtE,CAAC;gBACD,OAAO,GAAG,CAAC;YACb,CAAC,CAAC,CAAC;QACL,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;IACH,CAAC;IAED,MAAM,CAAC,EAAY;QACjB,IAAI,IAAI,CAAC,KAAK;YAAE,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QAC7C,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,MAAM,UAAU,GAAG,IAAI,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,SAAS,CAAC,CAAC;QAC/E,MAAM,MAAM,GAAG,IAAI,GAAG,EAAQ,CAAC;QAC/B,OAAO,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;YACzB,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACjC,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;YACrC,EAAE,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACpB,UAAU,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;gBACnC,SAAS;YACX,CAAC;YACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QACzB,CAAC;QACD,EAAE,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,MAAM,CAAC;IAChB,CAAC;IAEQ,OAAO;QACd,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF;AAED,oEAAoE;AACpE,MAAM,UAAU,IAAI,CAClB,IAAkB,EAClB,MAAoB,EACpB,OAA2B;IAE3B,OAAO,IAAI,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;AAClD,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Value combinators: just, sampledFrom, oneOf, optional.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { Generator } from "./core.js";
7
+ /** Generate a constant value. */
8
+ export declare function just<T>(value: T): Generator<T>;
9
+ /** Pick from a fixed list of values. Panics if empty. */
10
+ export declare function sampledFrom<T>(elements: T[]): Generator<T>;
11
+ /** Choose from multiple generators of the same type. */
12
+ export declare function oneOf<T>(...generators: Generator<T>[]): Generator<T>;
13
+ /** Generate either a value from the inner generator, or null. */
14
+ export declare function optional<T>(inner: Generator<T>): Generator<T | null>;
15
+ //# sourceMappingURL=combinators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinators.d.ts","sourceRoot":"","sources":["../../src/generators/combinators.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AAiBtD,iCAAiC;AACjC,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAE9C;AAyBD,yDAAyD;AACzD,wBAAgB,WAAW,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAE1D;AAgDD,wDAAwD;AACxD,wBAAgB,KAAK,CAAC,CAAC,EAAE,GAAG,UAAU,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,GAAG,SAAS,CAAC,CAAC,CAAC,CAEpE;AAgDD,iEAAiE;AACjE,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAEpE"}
@@ -0,0 +1,143 @@
1
+ /**
2
+ * Value combinators: just, sampledFrom, oneOf, optional.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { Labels, generateRaw } from "../testCase.js";
7
+ import { Generator, BasicGenerator } from "./core.js";
8
+ class JustGenerator extends Generator {
9
+ value;
10
+ constructor(value) {
11
+ super();
12
+ this.value = value;
13
+ }
14
+ doDraw(_tc) {
15
+ return this.value;
16
+ }
17
+ asBasic() {
18
+ const value = this.value;
19
+ return new BasicGenerator({ type: "constant", value: null }, () => value);
20
+ }
21
+ }
22
+ /** Generate a constant value. */
23
+ export function just(value) {
24
+ return new JustGenerator(value);
25
+ }
26
+ class SampledFromGenerator extends Generator {
27
+ elements;
28
+ schema;
29
+ constructor(elements) {
30
+ super();
31
+ if (elements.length === 0) {
32
+ throw new Error("sampledFrom requires at least one element");
33
+ }
34
+ this.elements = [...elements];
35
+ this.schema = { type: "integer", min_value: 0, max_value: this.elements.length - 1 };
36
+ }
37
+ doDraw(tc) {
38
+ return this.elements[generateRaw(tc, this.schema)];
39
+ }
40
+ asBasic() {
41
+ const elements = this.elements;
42
+ return new BasicGenerator(this.schema, (raw) => elements[raw]);
43
+ }
44
+ }
45
+ /** Pick from a fixed list of values. Panics if empty. */
46
+ export function sampledFrom(elements) {
47
+ return new SampledFromGenerator(elements);
48
+ }
49
+ class OneOfGenerator extends Generator {
50
+ sources;
51
+ basic;
52
+ constructor(sources) {
53
+ super();
54
+ if (sources.length === 0) {
55
+ throw new Error("oneOf requires at least one generator");
56
+ }
57
+ this.sources = sources;
58
+ const basics = sources.map((g) => g.asBasic());
59
+ if (basics.every((b) => b !== null)) {
60
+ const validBasics = basics;
61
+ const taggedSchemas = validBasics.map((b, i) => ({
62
+ type: "tuple",
63
+ elements: [{ type: "constant", value: i }, b.schema],
64
+ }));
65
+ this.basic = new BasicGenerator({ type: "one_of", generators: taggedSchemas }, (raw) => {
66
+ if (!Array.isArray(raw))
67
+ throw new Error(`Expected array, got ${typeof raw}`);
68
+ const tag = raw[0];
69
+ return validBasics[tag].parseRaw(raw[1]);
70
+ });
71
+ }
72
+ else {
73
+ this.basic = null;
74
+ }
75
+ }
76
+ doDraw(tc) {
77
+ if (this.basic)
78
+ return this.basic.doDraw(tc);
79
+ tc.startSpan(Labels.ONE_OF);
80
+ const index = generateRaw(tc, {
81
+ type: "integer",
82
+ min_value: 0,
83
+ max_value: this.sources.length - 1,
84
+ });
85
+ const result = this.sources[index].doDraw(tc);
86
+ tc.stopSpan();
87
+ return result;
88
+ }
89
+ asBasic() {
90
+ return this.basic;
91
+ }
92
+ }
93
+ /** Choose from multiple generators of the same type. */
94
+ export function oneOf(...generators) {
95
+ return new OneOfGenerator(generators);
96
+ }
97
+ class OptionalGenerator extends Generator {
98
+ inner;
99
+ basic;
100
+ constructor(inner) {
101
+ super();
102
+ this.inner = inner;
103
+ const innerBasic = inner.asBasic();
104
+ if (innerBasic) {
105
+ const nullSchema = {
106
+ type: "tuple",
107
+ elements: [{ type: "constant", value: 0 }, { type: "null" }],
108
+ };
109
+ const valueSchema = {
110
+ type: "tuple",
111
+ elements: [{ type: "constant", value: 1 }, innerBasic.schema],
112
+ };
113
+ this.basic = new BasicGenerator({ type: "one_of", generators: [nullSchema, valueSchema] }, (raw) => {
114
+ if (!Array.isArray(raw))
115
+ throw new Error(`Expected array, got ${typeof raw}`);
116
+ const tag = raw[0];
117
+ if (tag === 0)
118
+ return null;
119
+ return innerBasic.parseRaw(raw[1]);
120
+ });
121
+ }
122
+ else {
123
+ this.basic = null;
124
+ }
125
+ }
126
+ doDraw(tc) {
127
+ if (this.basic)
128
+ return this.basic.doDraw(tc);
129
+ tc.startSpan(Labels.OPTIONAL);
130
+ const isSome = generateRaw(tc, { type: "boolean" });
131
+ const result = isSome ? this.inner.doDraw(tc) : null;
132
+ tc.stopSpan();
133
+ return result;
134
+ }
135
+ asBasic() {
136
+ return this.basic;
137
+ }
138
+ }
139
+ /** Generate either a value from the inner generator, or null. */
140
+ export function optional(inner) {
141
+ return new OptionalGenerator(inner);
142
+ }
143
+ //# sourceMappingURL=combinators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"combinators.js","sourceRoot":"","sources":["../../src/generators/combinators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Composition generators: composite and record.
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ import { TestCase } from "../testCase.js";
7
+ import { Generator } from "./core.js";
8
+ /** Create a generator from an imperative function. */
9
+ export declare function composite<T>(fn: (tc: TestCase) => T): Generator<T>;
10
+ /**
11
+ * Generate plain objects by drawing each field from its generator.
12
+ * Uses the schema-based path (tuple schema) when all fields have asBasic(),
13
+ * otherwise falls back to composite draws with a FIXED_DICT span.
14
+ *
15
+ * @example
16
+ * ```ts
17
+ * const userGen = record({
18
+ * name: text({ minSize: 1 }),
19
+ * age: integers({ minValue: 0, maxValue: 120 }),
20
+ * active: booleans(),
21
+ * });
22
+ * ```
23
+ */
24
+ export declare function record<T extends Record<string, unknown>>(schema: {
25
+ [K in keyof T]: Generator<T[K]>;
26
+ }): Generator<T>;
27
+ //# sourceMappingURL=compose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose.d.ts","sourceRoot":"","sources":["../../src/generators/compose.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,QAAQ,EAAU,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAkB,MAAM,WAAW,CAAC;AAYtD,sDAAsD;AACtD,wBAAgB,SAAS,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,EAAE,QAAQ,KAAK,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAElE;AAkDD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,MAAM,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,EAAE;KAC/D,CAAC,IAAI,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAChC,GAAG,SAAS,CAAC,CAAC,CAAC,CAEf"}