lawspec 0.9.0 → 0.10.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 (42) hide show
  1. package/API-MIGRATION.md +78 -2
  2. package/LANGUAGE.md +10 -7
  3. package/NATIVE-BINDINGS.md +1046 -0
  4. package/PRIMITIVES.md +1 -1
  5. package/README.md +73 -23
  6. package/REFINEMENTS.md +1 -1
  7. package/RELEASE-0.10.md +60 -0
  8. package/api.mjs +23 -3
  9. package/bin/lawspec.mjs +17 -4
  10. package/build.json +56 -36
  11. package/core.wasm +0 -0
  12. package/examples/native-payments/go/example/payments/domain.go +38 -0
  13. package/examples/native-payments/go/example/payments/native_generators_test.go +13 -0
  14. package/examples/native-payments/go/lawspec.json +136 -0
  15. package/examples/native-payments/haskell/lawspec.json +149 -0
  16. package/examples/native-payments/haskell/src/PaymentsDomain.hs +21 -0
  17. package/examples/native-payments/haskell/test/PaymentGenerators.hs +12 -0
  18. package/examples/native-payments/java/lawspec.json +165 -0
  19. package/examples/native-payments/java/src/main/java/domain/PaymentsDomain.java +32 -0
  20. package/examples/native-payments/java/src/test/java/domain/PaymentGenerators.java +16 -0
  21. package/examples/native-payments/javascript/lawspec.json +149 -0
  22. package/examples/native-payments/javascript/src/payments_domain.mjs +44 -0
  23. package/examples/native-payments/javascript/test/lawspec_generators.mjs +6 -0
  24. package/examples/native-payments/kotlin/lawspec.json +165 -0
  25. package/examples/native-payments/kotlin/src/main/kotlin/domain/PaymentsDomain.kt +17 -0
  26. package/examples/native-payments/kotlin/src/test/kotlin/domain/PaymentGenerators.kt +12 -0
  27. package/examples/native-payments/python/lawspec.json +149 -0
  28. package/examples/native-payments/python/src/payments_domain.py +60 -0
  29. package/examples/native-payments/python/tests/lawspec_generators.py +15 -0
  30. package/examples/native-payments/rust/lawspec.json +167 -0
  31. package/examples/native-payments/rust/src/domain.rs +37 -0
  32. package/examples/native-payments/rust/src/lib.rs +2 -0
  33. package/examples/native-payments/rust/tests/support/lawspec_generators.rs +11 -0
  34. package/examples/native-payments/typescript/lawspec.json +149 -0
  35. package/examples/native-payments/typescript/src/payments_domain.ts +42 -0
  36. package/examples/native-payments/typescript/test/lawspec_generators.ts +8 -0
  37. package/examples/specs/payments.lawspec +76 -0
  38. package/examples-command.mjs +5 -0
  39. package/files.mjs +6 -6
  40. package/index.d.ts +53 -2
  41. package/native-examples.mjs +81 -0
  42. package/package.json +2 -2
package/PRIMITIVES.md CHANGED
@@ -1,4 +1,4 @@
1
- # LawSpec scalar reference (0.9.0)
1
+ # LawSpec scalar reference (0.10.0)
2
2
 
3
3
  A scalar has a declared domain, checked literals, equality, property inputs, and
4
4
  boundary fixtures. General collections, objects, pointers, and type-only constructs
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  **State the law once. Check it everywhere.**
4
4
 
5
- LawSpec 0.9 compiles reusable laws into native property tests, executable examples,
5
+ LawSpec 0.10 compiles reusable laws into native property tests, executable examples,
6
6
  and implementation adapters. The compiler is Haskell, distributed as prebuilt
7
7
  WebAssembly with a Node CLI and an asynchronous, typed JavaScript API.
8
8
 
@@ -36,12 +36,27 @@ Compiler API consumers should read the [schema v3 migration guide](API-MIGRATION
36
36
  Scalar values use tagged, lossless encodings; generated runtime placement is
37
37
  separate from artifact ownership. Java 25+ and Python 3.13+ baselines are unchanged.
38
38
 
39
+ ## Native domain bindings in 0.10
40
+
41
+ LawSpec 0.10 adds configuration for existing application products and sums,
42
+ function bindings, checked conversion hooks, and native property-generator
43
+ factories on all eight targets. Generators retain their framework's shrinkers;
44
+ explicit examples, boundaries, and finite-domain checks remain independent.
45
+ See the [native-binding reference and acceptance status](NATIVE-BINDINGS.md),
46
+ the [release notes](RELEASE-0.10.md), and
47
+ [schema 4 migration notes](API-MIGRATION.md#schema-4-native-bindings).
48
+ Existing specifications without bindings retain their behavior.
49
+
39
50
  ## Install and try it
40
51
 
52
+ LawSpec has its own [syntax-highlighting grammar and VS Code extension](editors/vscode/README.md)
53
+ for keywords, types, refinements, literals, and law names. GitHub needs upstream Linguist
54
+ support to use it; GitHub currently uses the Haskell fallback.
55
+
41
56
  Install [LawSpec from npm](https://www.npmjs.com/package/lawspec):
42
57
 
43
58
  ```sh
44
- npm install --save-dev lawspec@0.9.0
59
+ npm install --save-dev lawspec@0.10.0
45
60
  npx lawspec --version
46
61
  ```
47
62
 
@@ -55,8 +70,8 @@ local dependencies so LawSpec can create its `package.json` and test script:
55
70
  ```sh
56
71
  mkdir lawspec-example
57
72
  cd lawspec-example
58
- npm exec --package=lawspec@0.9.0 -- lawspec init --target javascript
59
- npm install --save-dev lawspec@0.9.0
73
+ npm exec --package=lawspec@0.10.0 -- lawspec init --target javascript
74
+ npm install --save-dev lawspec@0.10.0
60
75
  npx lawspec check
61
76
  npx lawspec explain 'example.atoi_codec::itoa and then atoi yields a'
62
77
  npx lawspec doctor
@@ -192,11 +207,13 @@ Reusable laws can declare typed unary function parameters and `requires Eq a`, n
192
207
  [parameterized refinements and executable contracts](REFINEMENTS.md).
193
208
  Definitions support law application, function application/composition, universal
194
209
  quantification, `implies`, Boolean predicates, scalar literals, and equality.
195
- Function signatures and quantified inputs support the [scalar catalog](PRIMITIVES.md),
196
- including mixed and multiple inputs. Generic variables are supported in reusable
197
- laws. Scalar types can also be intermediate or compared results. Functions are synchronous and support curried signatures with any positive
198
- number of scalar arguments. Text literals are double-quoted, with escapes such as `\"`, `\\`,
199
- `\n`, and `\t`; examples must bind each input to a literal of its declared type.
210
+ Function signatures and quantified inputs support the [scalar catalog](PRIMITIVES.md)
211
+ and [structural types](LANGUAGE.md), including mixed and multiple inputs.
212
+ Generic variables are supported in reusable laws. Scalar and structural values
213
+ can also be intermediate or compared results. Functions are synchronous and
214
+ support curried signatures with any positive number of arguments. Text literals
215
+ are double-quoted, with escapes such as `\"`, `\\`, `\n`, and `\t`; examples must
216
+ bind each input to a concrete value of its declared type.
200
217
  Text values contain Unicode scalar values; surrogate code points are rejected.
201
218
 
202
219
  Examples refer to the expanded input names, including names inherited from the
@@ -206,9 +223,10 @@ produce literal braces. Law blocks use this order:
206
223
  definition, optional description, optional rationale, examples, optional references.
207
224
  `--` starts a line comment. Names that cannot be emitted portably are diagnosed.
208
225
 
209
- General collections, external law packages, cross-unit imports beyond the
210
- prelude, async functions, direct existing-symbol binding and browser hosting are
211
- outside this release.
226
+ Collections beyond `List`, external law packages, cross-unit imports beyond the
227
+ prelude, async functions and browser hosting remain outside the language.
228
+ Direct existing-symbol bindings are part of LawSpec 0.10 described
229
+ above; the published 0.9 release uses implementation adapters.
212
230
 
213
231
  ## Algebra and currying (0.6)
214
232
 
@@ -263,7 +281,7 @@ reusable laws accept these curried functions, their partial applications, and
263
281
  scalar parameters. Quantified test inputs remain scalar.
264
282
 
265
283
  The prelude defines the following laws. Every row has an executable example in
266
- [algebra.lawspec](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/algebra.lawspec), including both sides of every
284
+ [algebra.lawspec](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/algebra.lawspec), including both sides of every
267
285
  combined law. `f` and `g` are binary operations, `inverse` is unary, and `e` and
268
286
  `zero` are scalar parameters. All these laws require equality of the element type.
269
287
 
@@ -331,7 +349,7 @@ their entire consequence. Every conjunct is type-checked and emitted. As with
331
349
  existing assertions, the first failure stops that individual test. `and` is now
332
350
  a reserved word.
333
351
 
334
- [Currying examples](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/currying.lawspec) demonstrate a four-argument
352
+ [Currying examples](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/currying.lawspec) demonstrate a four-argument
335
353
  function partially applied twice, a formatter with four heterogeneous arguments,
336
354
  and composition after partial application. Each example states its exact outputs.
337
355
  Run `node npm/bin/lawspec.mjs examples` after rebuilding to inspect all nine units
@@ -383,7 +401,7 @@ law `valid ports round trip` is
383
401
  end
384
402
  ```
385
403
 
386
- The [complete port example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/parse_port.lawspec)
404
+ The [complete port example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/parse_port.lawspec)
387
405
  defines valid ports as 1–65535, and covers both endpoints, ordinary ports, zero,
388
406
  negative values, and 65536. All explicit `expect` assertions run regardless of
389
407
  the law's condition. A false condition skips only the consequence: invalid ports
@@ -401,7 +419,7 @@ The prelude includes `satisfies predicate` (the predicate holds for every input)
401
419
  and `left inverse when predicate parse render` (the guarded round trip above).
402
420
  These reusable laws preserve the condition and its lexical bindings when expanded.
403
421
  `equivalent` can also compare two predicates, since `Bool` supports equality.
404
- The [Boolean flags example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/boolean_flags.lawspec)
422
+ The [Boolean flags example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/boolean_flags.lawspec)
405
423
  checks that flipping twice restores both `false` and `true`; all targets generate
406
424
  Boolean property inputs and explicit tests for both Boolean boundary values. Java caps Boolean-only JetCheck runs at the number of
407
425
  possible input combinations (up to 100), avoiding generator exhaustion.
@@ -480,7 +498,7 @@ This expands to `for all (x :: Int32) . render (x) = referenceRender (x)`.
480
498
  The example inherits the input name `x` from the prelude. Both functions are
481
499
  user-owned adapter functions; either may delegate to your existing code.
482
500
 
483
- [The complete example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/equivalent.lawspec) compares decimal
501
+ [The complete example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/equivalent.lawspec) compares decimal
484
502
  renderers and two implementations that clamp negative integers to zero. For
485
503
  JavaScript, their adapters can be:
486
504
 
@@ -517,7 +535,7 @@ law `normalizers agree` is
517
535
  end
518
536
  ```
519
537
 
520
- The [slug example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/slug.lawspec)
538
+ The [slug example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/slug.lawspec)
521
539
  compares two implementations of ASCII-space replacement. It includes empty,
522
540
  Unicode and escaped text. Each target uses its native string generator:
523
541
  JetCheck `Generator.stringsOf(Generator.asciiPrintableChars())`, Hypothesis `st.text()`, fast-check `fc.string()`,
@@ -544,7 +562,7 @@ law `canonicalization reaches a fixed point` is
544
562
  end
545
563
  ```
546
564
 
547
- The [canonical URL example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/canonical_url.lawspec)
565
+ The [canonical URL example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/canonical_url.lawspec)
548
566
  uses removal of **all trailing slashes** as a small fixed-point demonstration,
549
567
  not a complete URL canonicalization algorithm. For JavaScript:
550
568
 
@@ -553,13 +571,31 @@ export const canonicalize = value => value.replace(/\/+$/, "");
553
571
  ```
554
572
 
555
573
  Removing just one trailing slash fails the supplied repeated-slash example.
556
- The [mixed-input example](https://github.com/brain-fuel/lawspec/blob/v0.9.0/examples/specs/mixed_inputs.lawspec)
574
+ The [mixed-input example](https://github.com/brain-fuel/lawspec/blob/v0.10.0/examples/specs/mixed_inputs.lawspec)
557
575
  shows `Text` and `Int32` in the same quantified property and executable example.
558
- The JavaScript API represents input bindings and expected values as `number | string | boolean`.
559
- Each example includes `expectations: { actual: Expr; expected: number | string | boolean }[]`.
576
+ The JavaScript API represents example bindings as typed records whose values use
577
+ `DataValue`: lossless tagged scalar payloads or structural constructors. Expected results are
578
+ typed expressions inside `Assertion` trees, not untyped JavaScript primitives.
579
+ See the [API migration guide](API-MIGRATION.md) for their wire representation.
560
580
 
561
581
  ## Generate all example artifacts
562
582
 
583
+ To use native domain bindings, export the runnable payment
584
+ example (omit `--target` to export all eight languages):
585
+
586
+ ```sh
587
+ lawspec examples --example payments --target rust --output native_payments
588
+ cd native_payments/rust
589
+ # Install the dependencies listed in README.md, then:
590
+ lawspec check
591
+ lawspec generate
592
+ cargo test
593
+ ```
594
+
595
+ These projects include application-owned types, native generators, binding
596
+ configuration, and build files. Re-exporting preserves edits and leaves the
597
+ compiler's generation manifest separate from the example export manifest.
598
+
563
599
  ```sh
564
600
  npx lawspec examples
565
601
  # Or select a target and a relative output directory:
@@ -618,7 +654,7 @@ by the JS shim.
618
654
  ## Build and verify
619
655
 
620
656
  For contributors working from a repository checkout, build a local archive with
621
- `npm pack ./npm` and install it with `npm install --save-dev ./lawspec-0.9.0.tgz`.
657
+ `npm pack ./npm` and install it with `npm install --save-dev ./lawspec-0.10.0.tgz`.
622
658
  The package payload lives in `npm/`.
623
659
 
624
660
  ```sh
@@ -657,6 +693,20 @@ unchanged. Arguments select individual targets. `LAWSPEC_PYTHON=3.14` selects th
657
693
  additional Python reference environment. CI also exercises Node 22/24/26 and packs
658
694
  and installs the npm archive. Registry publication is a separate release action.
659
695
 
696
+ The native-binding acceptance command uses the installed npm archive, public CLI,
697
+ and the selected target's normal test command:
698
+
699
+ ```sh
700
+ node tools/native-example-integration.mjs rust
701
+ LAWSPEC_MACHINE_BITS=32 LAWSPEC_MINIFY=1 node tools/native-example-integration.mjs rust
702
+ ```
703
+
704
+ Replace `rust` with any supported target. It exports the payment project, verifies
705
+ correct behavior, rejects an incorrect fee, and checks regeneration. Per-command
706
+ logs live in `.artifacts/native-example-integration/`. See the
707
+ [acceptance reference](NATIVE-BINDINGS.md) for dependency overrides and remaining
708
+ verification gates.
709
+
660
710
 
661
711
  Refinement predicates can depend on earlier inputs. Generated tests backtrack from
662
712
  impossible prefixes, preserve the domain during shrinking, and validate function
package/REFINEMENTS.md CHANGED
@@ -1,4 +1,4 @@
1
- # Refinements and abstract integers (0.9.0)
1
+ # Refinements and abstract integers (0.10.0)
2
2
 
3
3
  A refinement restricts a scalar domain with a pure Boolean expression. LawSpec
4
4
  checks concrete examples, generates satisfying input tuples, and checks adapter
@@ -0,0 +1,60 @@
1
+ # LawSpec 0.10.0
2
+
3
+ ## Existing application models
4
+
5
+ Native bindings connect LawSpec products and sums to existing application types
6
+ on Java, Python, JavaScript, TypeScript, Go, Haskell, Kotlin and Rust. Configure
7
+ constructor and field mappings, bind adapter declarations to existing functions,
8
+ or supply paired conversion hooks for representations requiring custom code.
9
+ Bindings resolve against typed declaration identities; they do not change the
10
+ meaning of arithmetic, equality, definitions or refinements.
11
+
12
+ Checked bridges compose through generic and recursive types and the built-in
13
+ containers. They preserve exact numeric values, Symbol identity and distinct
14
+ absence states. Invalid native inputs, results, generator samples and shrink
15
+ candidates fail with context.
16
+
17
+ ## Native generators
18
+
19
+ Factories return their framework's generator: JetCheck, Hypothesis, fast-check,
20
+ Rapid, Hedgehog, Kotest or Proptest. Generic factories receive child generators.
21
+ Composition retains native shrinking. Explicit examples, deterministic boundaries
22
+ and finite-domain enumeration still run when the factory's distribution excludes
23
+ those values.
24
+
25
+ A factory can ignore an uninhabited parameter, as in `Phantom Empty`. Requesting a
26
+ value from that parameter fails generation; it cannot turn a property into a
27
+ vacuous success. Finite inhabited containers such as `List Empty` still enumerate.
28
+
29
+ Optional `stub: true` generator bindings create user-owned implementation files.
30
+ Regeneration preserves edits and reports changed factory signatures for review.
31
+
32
+ ## API and migration
33
+
34
+ Native binding requests negotiate schema 4. Schema 3 remains supported for
35
+ specifications without bindings. Structured native references and strict
36
+ configuration validation prevent older compilers from silently ignoring mappings.
37
+ Go additionally supports explicit import aliases; Rust binds tests to the
38
+ application library's type identities.
39
+
40
+ Existing adapter files cannot be overwritten by adopting a binding. Move their
41
+ implementations into the application module and save the old adapters before
42
+ generation. Generated source bridges, test helpers and user-owned application
43
+ files retain separate placement and ownership. See the
44
+ [migration guide](API-MIGRATION.md#schema-4-native-bindings) and
45
+ [ownership instructions](NATIVE-BINDINGS.md#ownership-regeneration-and-migration).
46
+
47
+ ## Runnable payment projects
48
+
49
+ `lawspec examples --example payments` exports a project for every target; use
50
+ `--target rust` or another language to select one. Each project includes an
51
+ application model, native generator, configuration, build files and instructions.
52
+ The shared specification checks exact fees, currency preservation, sum payloads,
53
+ ordered archives, duplicates and absence. Re-exporting preserves application
54
+ edits and the separate compiler generation manifest.
55
+
56
+ Both 32-bit and 64-bit logical machine profiles and readable/compact output are
57
+ covered by the acceptance matrices. Java 25+, Python 3.13+ and the other published
58
+ toolchain baselines remain unchanged. Python output follows PEP 8.
59
+
60
+ GADTs, dependent indices and cross-unit packages remain subsequent work.
package/api.mjs CHANGED
@@ -4,9 +4,29 @@ import {loadCore} from './launcher.mjs';
4
4
  export async function createCompiler() {
5
5
  const call = await loadCore();
6
6
  return {
7
- check: (input) => call({schemaVersion: 3, ...input, method: 'check'}),
8
- expand: (input) => call({schemaVersion: 3, ...input, method: 'expand'}),
7
+ check: (input) =>
8
+ call(
9
+ {
10
+ schemaVersion: input.nativeBindings === undefined ? 3 : 4,
11
+ ...input,
12
+ method: 'check',
13
+ }
14
+ ),
15
+ expand: (input) =>
16
+ call(
17
+ {
18
+ schemaVersion: input.nativeBindings === undefined ? 3 : 4,
19
+ ...input,
20
+ method: 'expand',
21
+ }
22
+ ),
9
23
  planGeneration: (input) =>
10
- call({schemaVersion: 3, ...input, method: 'planGeneration'}),
24
+ call(
25
+ {
26
+ schemaVersion: input.nativeBindings === undefined ? 3 : 4,
27
+ ...input,
28
+ method: 'planGeneration',
29
+ }
30
+ ),
11
31
  };
12
32
  }
package/bin/lawspec.mjs CHANGED
@@ -19,7 +19,7 @@ const options = {};
19
19
  const positional = [];
20
20
  for (let i = 0; i < args.length; i++) {
21
21
  const arg = args[i];
22
- if (["--target", "--project", "--config", "--output", "--machine-bits"].includes(arg)) {
22
+ if (["--target", "--project", "--config", "--output", "--machine-bits", "--example"].includes(arg)) {
23
23
  if (!args[i + 1] || args[i + 1].startsWith("--"))
24
24
  throw new Error(`Missing value for ${arg}`);
25
25
  options[arg.slice(2)] = args[++i];
@@ -173,13 +173,13 @@ async function main() {
173
173
  }
174
174
  if (!verb || ["help", "--help", "-h"].includes(verb)) {
175
175
  output(
176
- "LawSpec 0.9.0\nUsage: lawspec init --target <language> [--project <directory>] [--minify]\n lawspec check | doctor | explain <unit>::<law> | generate\n lawspec examples [--target <language>] [--output example_artifacts]\nOptions: --config <path>, --target <language>, --machine-bits <32|64>, --json\nGeneration: --dry-run, --check, --minify\nTargets: " +
176
+ "LawSpec 0.10.0\nUsage: lawspec init --target <language> [--project <directory>] [--minify]\n lawspec check | doctor | explain <unit>::<law> | generate\n lawspec examples [--example payments] [--target <language>] [--output <directory>]\nOptions: --config <path>, --target <language>, --machine-bits <32|64>, --json\nGeneration: --dry-run, --check, --minify\nTargets: " +
177
177
  targets.join(", "),
178
178
  );
179
179
  return;
180
180
  }
181
181
  if (verb === "--version") {
182
- output("0.9.0");
182
+ output("0.10.0");
183
183
  return;
184
184
  }
185
185
  if (positional.length > (verb === "explain" ? 1 : 0))
@@ -191,8 +191,15 @@ async function main() {
191
191
  options["dry-run"] ||
192
192
  options.check
193
193
  )
194
- throw new Error("examples supports --target, --output, --json and --minify only");
194
+ throw new Error("examples supports --example, --target, --output, --machine-bits, --json and --minify only");
195
195
  const result = await generateExamples(options);
196
+ if (options.example) {
197
+ output(options.json ? result : result.map(r =>
198
+ `${r.target}: payment project in ${r.directory}; ${r.preservedAdapters.length} user files preserved.` +
199
+ (r.adapterUpdates.length ? `\nReview changed example files: ${r.adapterUpdates.map(a => a.path).join(", ")}` : "")
200
+ ).join("\n") + "\nOpen each project's README.md, run lawspec generate, then its native test command.");
201
+ return;
202
+ }
196
203
  output(
197
204
  options.json
198
205
  ? result
@@ -207,6 +214,7 @@ async function main() {
207
214
  return;
208
215
  }
209
216
  if (options.output) throw new Error("--output is only supported by examples");
217
+ if (options.example) throw new Error("--example is only supported by examples");
210
218
  if (options.minify && !["init", "generate", "examples"].includes(verb))
211
219
  throw new Error("--minify applies to init, generate and examples");
212
220
  if (verb === "init") return init();
@@ -251,6 +259,10 @@ async function main() {
251
259
  const compiler = await createCompiler();
252
260
  if (verb === "check") {
253
261
  const result = diagnostics(await compiler.check(input));
262
+ for (const target of selected) {
263
+ if (target.nativeBindings !== undefined)
264
+ diagnostics(await compiler.check({...input, nativeBindings: target.nativeBindings}));
265
+ }
254
266
  output(
255
267
  options.json
256
268
  ? result
@@ -289,6 +301,7 @@ async function main() {
289
301
  target: target.language,
290
302
  sourceDir: target.sourceDir,
291
303
  testDir: target.testDir,
304
+ nativeBindings: target.nativeBindings,
292
305
  minify: options.minify === true,
293
306
  }),
294
307
  ).files,
package/build.json CHANGED
@@ -64,12 +64,14 @@
64
64
  "src/LawSpec/GoData.hs",
65
65
  "src/LawSpec/GoDefinitions.hs",
66
66
  "src/LawSpec/GoExpr.hs",
67
+ "src/LawSpec/GoNativeBinding.hs",
67
68
  "src/LawSpec/GoProperties.hs",
68
69
  "src/LawSpec/GoTestHelpers.hs",
69
70
  "src/LawSpec/GoTypeRefs.hs",
70
71
  "src/LawSpec/HaskellData.hs",
71
72
  "src/LawSpec/HaskellDefinitions.hs",
72
73
  "src/LawSpec/HaskellExpr.hs",
74
+ "src/LawSpec/HaskellNativeBinding.hs",
73
75
  "src/LawSpec/HaskellProperties.hs",
74
76
  "src/LawSpec/HaskellTestHelpers.hs",
75
77
  "src/LawSpec/HaskellTypeRefs.hs",
@@ -77,14 +79,18 @@
77
79
  "src/LawSpec/JavaData.hs",
78
80
  "src/LawSpec/JavaDefinitions.hs",
79
81
  "src/LawSpec/JavaExpr.hs",
82
+ "src/LawSpec/JavaNativeBinding.hs",
80
83
  "src/LawSpec/JavaProperties.hs",
81
84
  "src/LawSpec/JavaTestHelpers.hs",
82
85
  "src/LawSpec/KotlinData.hs",
83
86
  "src/LawSpec/KotlinDefinitions.hs",
84
87
  "src/LawSpec/KotlinExpr.hs",
88
+ "src/LawSpec/KotlinNativeBinding.hs",
85
89
  "src/LawSpec/KotlinProperties.hs",
86
90
  "src/LawSpec/KotlinTestHelpers.hs",
87
91
  "src/LawSpec/Model.hs",
92
+ "src/LawSpec/NativeBinding.hs",
93
+ "src/LawSpec/NativeRequest.hs",
88
94
  "src/LawSpec/Parser.hs",
89
95
  "src/LawSpec/PortableGenerator.hs",
90
96
  "src/LawSpec/PortableTestHelpers.hs",
@@ -93,6 +99,7 @@
93
99
  "src/LawSpec/PythonData.hs",
94
100
  "src/LawSpec/PythonDefinitions.hs",
95
101
  "src/LawSpec/PythonExpr.hs",
102
+ "src/LawSpec/PythonNativeBinding.hs",
96
103
  "src/LawSpec/PythonTypes.hs",
97
104
  "src/LawSpec/Refinement.hs",
98
105
  "src/LawSpec/RuntimeSources.hs",
@@ -100,12 +107,15 @@
100
107
  "src/LawSpec/RustDefinitions.hs",
101
108
  "src/LawSpec/RustEmit.hs",
102
109
  "src/LawSpec/RustExpr.hs",
110
+ "src/LawSpec/RustNativeBinding.hs",
111
+ "src/LawSpec/RustNativeGenerators.hs",
103
112
  "src/LawSpec/Scalar.hs",
104
113
  "src/LawSpec/SpecializeDefinitions.hs",
105
114
  "src/LawSpec/Testing.hs",
106
115
  "src/LawSpec/WebData.hs",
107
116
  "src/LawSpec/WebDefinitions.hs",
108
117
  "src/LawSpec/WebExpr.hs",
118
+ "src/LawSpec/WebNativeBinding.hs",
109
119
  "src/LawSpec/WebTypes.hs",
110
120
  "stack.yaml",
111
121
  "stack.yaml.lock",
@@ -116,34 +126,34 @@
116
126
  "wasm/lawspec-wasm.cabal"
117
127
  ],
118
128
  "digests": {
119
- "lawspec.cabal": "f3372cb64f48514e0e7b16c2ea95636845cdd817b8231e23283b5af8d988fca2",
120
- "package.yaml": "6f039e41854347b0443378de9b163e541e7f4b77448c8f620199a60d36bafcca",
129
+ "lawspec.cabal": "b38f73ab83f833725b64ae4d0df07783efbdeacf367e99e378c18dddbb864f9d",
130
+ "package.yaml": "c682a129e7fdec4ae5d60d229c622ad05714fd52c6d83a3c44815b232fb4459d",
121
131
  "runtime/LawSpecCodecs.hs": "90cb1ed15d7ab664a17a054580c849408d77cfd2b2adcb4a3228b05132caeaca",
122
- "runtime/LawSpecDataStrategies.hs": "840a316e1a69a862957bbd0f799440fc434240c156a3398e5be6563ecaa70a1b",
123
- "runtime/LawSpecDataStrategies.java": "7e87c952ed192bf93a4b40f251a097148b7387ce7d505b5bc893cd9d51af3e65",
132
+ "runtime/LawSpecDataStrategies.hs": "0b6639d200101bfc3c850278133a7f686bfc3423c81ccc7d82f161847700c914",
133
+ "runtime/LawSpecDataStrategies.java": "ade2e132f116d261c6e8c198c6f87515193ceda8ab83b1006627eebb72321ed1",
124
134
  "runtime/LawSpecKotlin.kt": "0cf3b7de0406155225ccca33ee3dfdf8f0456c47d577f6be8f1265c13df838cb",
125
135
  "runtime/LawSpecKotlinCodecs.kt": "6210f77dbbe24ba2088db48dae5415abf0993fe552fb3a57d29430807efbc297",
126
- "runtime/LawSpecKotlinStrategies.kt": "2841edc3595f6d291859cc7edd31ea52093acf86d3542f07575784b01f9de237",
136
+ "runtime/LawSpecKotlinStrategies.kt": "73deed2d5d13529220147b530743a5f9bee72467e940bb357b2c3152ee6ec4ee",
127
137
  "runtime/LawSpecRuntime.hs": "5ced6a6a86a892ae63a544d4c4a4429bf756a730ea786478d820c8070cc96402",
128
138
  "runtime/LawSpecRuntime.java": "c7b7cfc9b7c22b082edee14a52d95ef80ebe01ee56988c22702f629ea24b8a4f",
129
139
  "runtime/LawSpecSchema.hs": "9912d9f525426a598f9c03c29cfc7bacf80218f73c9d537d8c1257bae245aa33",
130
140
  "runtime/LawSpecSchema.java": "885f5f17a9ea1bdb86915dc184aea25b72c3062d6ddb9605530310540b1cc166",
131
141
  "runtime/LawSpecStrategies.kt": "569f7775c0ac44765d05567cbf62d026558ac193c080ca71681ec6ee49c21794",
132
- "runtime/lawspec_codecs.go": "abc910b8ea65f503b2df2c236250b5398012fe5eaf30f3e91d968e34c0897c1e",
133
- "runtime/lawspec_data_strategies.go": "37aed9e49a286ea74ad9004c85e2ee4e780c99634735f0b40b0233ac24a41443",
134
- "runtime/lawspec_data_strategies.mjs": "b39db076de1fc4310633a5271a10b336c56d6b1778c6cd8c2bd937f69e87a97d",
135
- "runtime/lawspec_data_strategies.py": "542320b8733dea4cef96efcbc0ed65a949a90ca94b1771b0bee5773d06740e9a",
142
+ "runtime/lawspec_codecs.go": "b3024fe60b3b66df9ebffe995ab5bb0294a609a82c611d54957e092eac29f2f5",
143
+ "runtime/lawspec_data_strategies.go": "cbddf44fbd222ad39bda3278dd433c6592a90c1808a5c157e02d8be931244c9a",
144
+ "runtime/lawspec_data_strategies.mjs": "f2e04a8d1b418afa6b8b6a993e222bdd5d84fca800e7f5071157b7888af0907c",
145
+ "runtime/lawspec_data_strategies.py": "685212fa4ecdde0139336d9fb9a6b8aca15ed5d3eab02c33b4cca4b39ad21eb5",
136
146
  "runtime/lawspec_runtime.go": "af6ef660387b625b3bb5fcd57f06260c821d4f65eda158db44ad12d66e1d70f8",
137
147
  "runtime/lawspec_runtime.mjs": "3b7877c1ee523afba30ed24cd452e2a6126d9e741c7675600e867600d7a73f46",
138
148
  "runtime/lawspec_runtime.py": "2f780bc92762eb1115f734a36cc224ae34504929b4ff0ec506735cfa9e3ab02b",
139
149
  "runtime/lawspec_runtime.rs": "7ae8afaad638a3d9d6973eebc7cd6daecc8012ec57f3f12ff50cca16e23e15b6",
140
150
  "runtime/lawspec_schema.go": "bdfb6f2552bfccf56073d52f7cdbe1d784cba2d956c29762d77df7ad6bba8d67",
141
- "runtime/lawspec_schema.mjs": "d204852d89aa862fc980225c111064e7c41bce5873c08063472b3da66190530c",
142
- "runtime/lawspec_schema.py": "bf5c719caec1a91c5720be140ceec2cd01a6a2e0cb9a89c7a9bb05fdeecb34e7",
143
- "runtime/lawspec_strategies.rs": "74c7b58e5ae119c226cec15b5f12875ba3647e45d4868086543ead6fed3bcc3d",
144
- "runtime/rust/Cargo.lock": "dd5a3c0ba85579d13e61040334e9b16866124d2e88754948ec7dd512ade026ca",
145
- "runtime/rust/Cargo.toml": "4bd3bb457970bf8f7af8531fc45fd6b605f995594a3ee0f60f7f1aaf765bb8aa",
146
- "src/LawSpec/Api.hs": "532960f438214b4ca8a43d8d60777b6086e323f0c54fc7d1bc6bdbf0592ea319",
151
+ "runtime/lawspec_schema.mjs": "60eb4204461eaa2c207fc7c3394014e2a814e4383b7045c065b4dae7c7a202c2",
152
+ "runtime/lawspec_schema.py": "b6967ef1a33fe6a1a180d5573ec37cd8bb2079c06e961ac2eeb05f23cffcdd07",
153
+ "runtime/lawspec_strategies.rs": "ee2d42c4bc86bf1ccfcd3a8efc5628475829ea2551c4321e217485fca63433fa",
154
+ "runtime/rust/Cargo.lock": "03b17464317ee1e91281576aab67007cd8956e58a9d22665bc29045acdbbfa4e",
155
+ "runtime/rust/Cargo.toml": "615f3f40d2901e36b8ca5f2c105863264c93327c939a04f61469c658d352255f",
156
+ "src/LawSpec/Api.hs": "392f6e8c1a9ae81a95e219ac071e5b4bea03ee330d63b829036f8f54b2eda8a7",
147
157
  "src/LawSpec/Backend.hs": "03c3b0cd62467ca677c88d29d7b12b2ab505cc0076d93d1f48fbddb0e9bcf133",
148
158
  "src/LawSpec/Capabilities.hs": "e43d4fc3a4481fbb8aa3ff1c3f41f7e7fca5db01bfe256a30162a45d75a00c1c",
149
159
  "src/LawSpec/Code/Doc.hs": "9e3b70f85deb1dcbce385af1d0cd4bea2dfa8a2d806d54745d4bb437406673e5",
@@ -162,12 +172,12 @@
162
172
  "src/LawSpec/Core/Semantics.hs": "a9d019433e3b9731f8cd0f65ec0ccc53179824bea58247b72df26760b878c2b6",
163
173
  "src/LawSpec/Core/Total.hs": "95d2b19ba7fbfd033295504d31f786815384003b3b4d370776860b423cf079dd",
164
174
  "src/LawSpec/Core/Totality.hs": "8f5b5d69f4baaba45301899ef568cbe90133943c3771ba78d492424e9725e7a7",
165
- "src/LawSpec/Core/Types.hs": "4adf656d17812b68e8bf2d541908c769772cd5bfc9ac7a6c367160a5c40c9212",
175
+ "src/LawSpec/Core/Types.hs": "48ed1d197ce7089737895b7279f93437301fcfacff8b3a8dd98ecd7f1cb32b37",
166
176
  "src/LawSpec/Core/Validate.hs": "0f045241215e068081d6cd7cf451f0166671bae5fffafda71a2e2320e8014c27",
167
177
  "src/LawSpec/Core/Value.hs": "f2b2e4d82491e184d60b1217922b25c57a06cbbaecb2cb6f31174af50268fbc9",
168
- "src/LawSpec/CoreEmit.hs": "868633c03239f12543a357677a273896839a0c044f402477a998b9299557c9cd",
169
- "src/LawSpec/CoreNativeScalarEmit.hs": "43f1a22e95539b717a4a9c50b159d6b0b3879278fc90992a40dba4503f614c94",
170
- "src/LawSpec/CoreScalarEmit.hs": "485e51dbe3f4dd2f23fb586737364f83e4af98ab532a1462c8b8451fefdb69ed",
178
+ "src/LawSpec/CoreEmit.hs": "075f06ef1be2437542967b171c535686f33ed4645f6525a93c1024a9fbf68582",
179
+ "src/LawSpec/CoreNativeScalarEmit.hs": "6caf801922e8969eac7926bef641d950aebf5cd32b2e4b7ce3f6f32f91f41d99",
180
+ "src/LawSpec/CoreScalarEmit.hs": "ea87bcf97a7be02cb4e83728b9dd4f5fa5a0c461e3f31f89e4d28242c148b43c",
171
181
  "src/LawSpec/Data.hs": "9dbeafa120276b114dad790ec69e617f7ad0c632e3c718962f2f7faf8ca327f4",
172
182
  "src/LawSpec/DefinitionTotality.hs": "7671b7efb0cac5d796b074d48b2c10940e5bd0b5df082b926aee694903285efa",
173
183
  "src/LawSpec/Domain.hs": "222d15f0012ae630802238a6d7e1ee78d1e718b599f5ebb5a1ddc4e8d29d68c3",
@@ -175,31 +185,37 @@
175
185
  "src/LawSpec/Emit.hs": "9f34f5765915a2a12a66a6dca647ddaef9289372956802c6d99cf0cfec447c7a",
176
186
  "src/LawSpec/Eval.hs": "b0872ba8a6974463b32776653c2939826a6be87318c15641401f913f6b139de2",
177
187
  "src/LawSpec/Frontend.hs": "fbf091b9c96f5b5361dbf4f65819634c0f8526ff98550d97c434c0d47af7839e",
178
- "src/LawSpec/Gen.hs": "0410d4db3727a7999bc08a581301eb71ab570671e0ebeef7f1570ff76152b0a7",
179
- "src/LawSpec/GoData.hs": "813770986acac02846e446e02e72f634b328c2c23c083fd3bfafbe236524e8a2",
188
+ "src/LawSpec/Gen.hs": "c76d00fb1f7e9ed2eed7d387f1cd86cf4d12cc57f007abb0e479043b0ed377e6",
189
+ "src/LawSpec/GoData.hs": "35efbfdc1079e777d4760069fa2405a9700bbabab7dc7e3c2c5e0757312ea201",
180
190
  "src/LawSpec/GoDefinitions.hs": "09e9e4b60cfea893d35589cd18bc8a6099789d81e0f57ae5cb018bd95bd4838b",
181
191
  "src/LawSpec/GoExpr.hs": "da3a7cc0e3d2906886dc44f6b990e72098bb351558bbb31ee335da7382fac58a",
182
- "src/LawSpec/GoProperties.hs": "c0bbbba3b6d15b14c28095dd5c6f35d30aa70fd5991fe95d6f6642d0f69b1d42",
192
+ "src/LawSpec/GoNativeBinding.hs": "1ad8ea4cec6187c7e6005651c0edeec69e196eb329fb958c833da7751225aa1b",
193
+ "src/LawSpec/GoProperties.hs": "b0b92af071b70058802627bfb971e1b64e05847f27ef0645b2d7325a3867fe1d",
183
194
  "src/LawSpec/GoTestHelpers.hs": "dee55ee8505370e932773b8c685f4a1f380129e6f43f8806bf1e82efb99451b1",
184
195
  "src/LawSpec/GoTypeRefs.hs": "7f239f5ac3ac8bd21c8f76c328049f7715d8562ee1382befa0a58abd4f15f726",
185
- "src/LawSpec/HaskellData.hs": "125d5b8331d4e0a737f5de2fc28cf01677ba7e275b59238416eafdb9b973c809",
196
+ "src/LawSpec/HaskellData.hs": "51374f35de2b1d6c78d15597e41e6f0695fe5fdb040cbb35a7d03d23fa3a3179",
186
197
  "src/LawSpec/HaskellDefinitions.hs": "535a8d644d5ddb98c22fa6bdf34cf2baa787aa1f5b900815c621d0d65ede0f0f",
187
198
  "src/LawSpec/HaskellExpr.hs": "f4144cf2022ef0a3bec6d796ebe7d2f42563e9d25758b9f362cd5545b47e802b",
188
- "src/LawSpec/HaskellProperties.hs": "770b5047ec35e99ce186b65f22d913e0e117f33a3103d5382176ccf4ec50393a",
199
+ "src/LawSpec/HaskellNativeBinding.hs": "9f98aa0c8659b572bd6486a0e29c4692bc6432db8639fa74a09bbf1b771bbfa6",
200
+ "src/LawSpec/HaskellProperties.hs": "4a7c2aafbb3418e7e926d420d59e810a70e80b8e61a5efaad73d3282038c9d3c",
189
201
  "src/LawSpec/HaskellTestHelpers.hs": "51e59b2abc9e85455e3c8e2c6baadb27e5d319081cb730d2ce56be5dc8053897",
190
202
  "src/LawSpec/HaskellTypeRefs.hs": "2225b2a5e2ab3662e7202d23b24f4d6db48353b35ae28df8acd2b92fd2b97574",
191
203
  "src/LawSpec/Inference.hs": "78285145897f03c3c4adc37acf0f490ea779bab3975fb2830628dae3a152fe38",
192
- "src/LawSpec/JavaData.hs": "8f5720812a899e02f7d607a7acef133b7aec4a7617e597700a87e436604e0563",
204
+ "src/LawSpec/JavaData.hs": "177713377f7a38d69fbfd7891899357fc55782cf1d361f2e9dd5baf8725d4067",
193
205
  "src/LawSpec/JavaDefinitions.hs": "9c0fe11bd4849af09bbe3d941d89ba609a2dabecdc1c8b09b6ddbf69671c8f92",
194
206
  "src/LawSpec/JavaExpr.hs": "6f237b0fc1eabe2d53c160f4cb781f8b77b478383f1a77ca4ccc8f08ac0dbcd0",
195
- "src/LawSpec/JavaProperties.hs": "6cacfc6a005ac93a684e94efbfa7f83619d8658a396722b3fc47e533ba04cac1",
207
+ "src/LawSpec/JavaNativeBinding.hs": "8abbae78959a5cb61b7c6ae1c9071e43d10e26c2f421766d431fa18031f87173",
208
+ "src/LawSpec/JavaProperties.hs": "ecc1c94bb212d214f1eb8b2897204b65390aad7be858afd8e118e71e28d46bf2",
196
209
  "src/LawSpec/JavaTestHelpers.hs": "e6f4b9bbb7e5f07ece6ab1845e12aa661e62e8b926680b11454223fc3ec1523d",
197
- "src/LawSpec/KotlinData.hs": "338f576204e1f30cc0fdf82c806cbffcfbed3a5dfd1b33ac91cde7d975a28360",
210
+ "src/LawSpec/KotlinData.hs": "7785fc0c091e50010bce3002355f01c1d237fce05bca6a7ce6de6d207737e228",
198
211
  "src/LawSpec/KotlinDefinitions.hs": "97d7d407d4bbdb4ce16035d607dbbcb8e3d6f5db513f2123a2c269e3dc6d2b38",
199
212
  "src/LawSpec/KotlinExpr.hs": "20312f0774f1d0832a21a19b93c8103e2791ecd32a827d8e9c4f2b4830a996a0",
200
- "src/LawSpec/KotlinProperties.hs": "670a5585a552a2ac91922938a859ca437c32fafd085517bdf2ee169b4d6129c2",
213
+ "src/LawSpec/KotlinNativeBinding.hs": "1aec7854758f07a4d2288de13931fbb88ef32220f85d3c84fe8233ad67b6d095",
214
+ "src/LawSpec/KotlinProperties.hs": "9d71af0bd05db95ab4cbd80210730c126f235d5b16dc07ca76c6230119b788c6",
201
215
  "src/LawSpec/KotlinTestHelpers.hs": "74810d65faafc6ed4d64b1fb0596cda4186e586b7144a7441641b798795bc324",
202
216
  "src/LawSpec/Model.hs": "1d7ceb7bd66e3d496eef89eaa86403e6896472317ca9a4be86e0c933a7cce403",
217
+ "src/LawSpec/NativeBinding.hs": "33959b0fd432ad4150f3b685f6438e284b801c2a59d9ef3132486a1cc7c8925a",
218
+ "src/LawSpec/NativeRequest.hs": "fb2dc88f42424ca520533700eab68c407a5de83807d1b0d8c976e6c4f3d65212",
203
219
  "src/LawSpec/Parser.hs": "ad11e8f06371e98f295fae0245edceac8142320f054d0c3cb5600bc72588e17e",
204
220
  "src/LawSpec/PortableGenerator.hs": "69d457e39f539c77fc7a4c08205e75352bbecd9dfdff031a283a39bf44b22d49",
205
221
  "src/LawSpec/PortableTestHelpers.hs": "8ba4d87183c8c11f6ef1ce21c170127335797154f29fb97ad3429f032a167fd3",
@@ -208,19 +224,23 @@
208
224
  "src/LawSpec/PythonData.hs": "07e9bb54a1515f3f4744b7b9bb43633cbdbf07b3f9e35efef511753f97e216d5",
209
225
  "src/LawSpec/PythonDefinitions.hs": "bc7b971be97339f2d9e4962ad98100878266176aeccd2a9dfd014e2db9550bd8",
210
226
  "src/LawSpec/PythonExpr.hs": "23d7d24b5fb4efff9cb63d38c02a93d95744ec79b4565daf1412088fc7c4ba59",
227
+ "src/LawSpec/PythonNativeBinding.hs": "6b7d7f34ce97fb518aef7413d3f72a3a199c2202f0c25a922d860a21c93acc62",
211
228
  "src/LawSpec/PythonTypes.hs": "ef928bfeb4324eb6e53c99cae247cc2fa84816075d81de4589d14abaa326656a",
212
229
  "src/LawSpec/Refinement.hs": "8058a9f7e433b4b00ef0966a9ea2be3c91ae93b591ed58a1ffcb792d316193d3",
213
- "src/LawSpec/RuntimeSources.hs": "ca453784dd06b7be37568aa142e402fabf9a572d6144766fabf14677d77d95e8",
214
- "src/LawSpec/RustData.hs": "08e2c1e2181cbe120362b9fe87881dc78aaa4878c7a7fcec46d1df086b658ae5",
230
+ "src/LawSpec/RuntimeSources.hs": "27ee0e26827a9f6fe9bdbaf29447980b0fd3289aa8350fda9996d59218718e79",
231
+ "src/LawSpec/RustData.hs": "8fda864335ccb5478c39f56cb714d5275edf36fcbdc2d152bbe94960b644ad98",
215
232
  "src/LawSpec/RustDefinitions.hs": "5d0328a8b17e0cb5067f65d23f0f2cd2a96b92e4b1c3d6e22b7cb08255697177",
216
- "src/LawSpec/RustEmit.hs": "4fbbf0e81627d477fd42db380cd7ff067c4a8641a9e74957d93ba2f3b0dce79b",
233
+ "src/LawSpec/RustEmit.hs": "e01be4504cde6ebfeae0327a1304e149bd49e2ef5ff96ec0cb9cf718c7041888",
217
234
  "src/LawSpec/RustExpr.hs": "04b2ef81417b811c7b98a98acdadab4e588ca8757964a63ba8dc5936c36479e6",
235
+ "src/LawSpec/RustNativeBinding.hs": "9d08348da571ac335e335e48c1ad4a67108f7bca54119f5960480e97a6d1da84",
236
+ "src/LawSpec/RustNativeGenerators.hs": "a3b1484d9ff0008e4f961aa81d0aa51da57ec0cd7909124e80c98d56aacc8ce9",
218
237
  "src/LawSpec/Scalar.hs": "52e61fec81a337bb5b35e9e6f501446cf0b18bffa6c6af2ddc5aeac2d6e07131",
219
238
  "src/LawSpec/SpecializeDefinitions.hs": "08f2fe674a5e00d1be396d9edab0dd2c948b7beb12fa99f2a6aba00cbdf01e33",
220
239
  "src/LawSpec/Testing.hs": "db1a427ac2197e447faf2a36eccfe965c58eaa0ba07bc494bf1ba24e4af43ad4",
221
- "src/LawSpec/WebData.hs": "d32ed71cc09a5715b6fbaf2c5784afc939e2cb61db4b364f7bed98118fd63899",
240
+ "src/LawSpec/WebData.hs": "919af27be12f63f17762e0c052341ab82dcee5d45951a4fd9c66abead98d1ee0",
222
241
  "src/LawSpec/WebDefinitions.hs": "fd985db70c778c8014b780666ac327018e05260be610fa717b8c5477ba9638b4",
223
242
  "src/LawSpec/WebExpr.hs": "0389dcd5cf7479dd23ef034b1012de6ebd70bf1dc9e3d90981dfb0ba2702596f",
243
+ "src/LawSpec/WebNativeBinding.hs": "512c224b8fbe979eac3f490bb035f9371097eb13399bd361c016b397f8c2c777",
224
244
  "src/LawSpec/WebTypes.hs": "f77ffee1e0c7929964a889fb252c1c5d0977afed94664ffcb0f8770c37b98c70",
225
245
  "stack.yaml": "20ccf4d599e355e60b7aa4f814a7cd4299fe2048616cc2e6dbdc22a7bd8cec73",
226
246
  "stack.yaml.lock": "ae222b9c81af920c56e50fa4596fa57786e7fa5a7b461390362b2b2ff63818c7",
@@ -228,10 +248,10 @@
228
248
  "wasm/app/Exports.hs": "4ecbdac8faa2449e6fc61b93c82e6278fa14374154f29b4dacf0eef433f06a47",
229
249
  "wasm/cabal.project": "021e560afdc5eb4cb7169e7119ecb8f92c9ee170245af909c94b612941bff5cc",
230
250
  "wasm/cabal.project.freeze": "733dbed3d2ecccb26e874fd58f136296dad772184deb1658c196b5d54a0814dc",
231
- "wasm/lawspec-wasm.cabal": "61a21f9fc39087839a0df9781d94c9e7ed3dc375316c06e7dac36bd5e67e7f20",
232
- "npm/core.wasm": "544ee4b0706f30b73ec6d4d1de1c27da7ebf9838c1dd1b9cff45b7c0393773da",
251
+ "wasm/lawspec-wasm.cabal": "3915e30a899fa1aaaa811c225965bd8b39a25bc639299ae6077587cd09020688",
252
+ "npm/core.wasm": "6424553b1a5df71da4f7bb54acdd09fd15d6335954df76035e0015de18124faf",
233
253
  "npm/core_jsffi.js": "88d136efe92f7cff5758c8fec8d9b6bbc9707fe37741cebeeb415fe34ce3d72b",
234
- "npm/api.mjs": "6e25bb1f187d073f56badc1cd66c6c7f779cf68f1c5607d702d775c1c8b8a6dd",
235
- "npm/index.d.ts": "d1348a783a116752c8ff2bf31fc29aab107b1452a516bd7b594153e3620cefcd"
254
+ "npm/api.mjs": "e93251db289ff0609abaff78ad67f0a9af82508c1141c6a999604f67c56b6e7d",
255
+ "npm/index.d.ts": "2674f8830bd20a2b9ef7dfa99e183598125b6bcc17e8d454e8f7cca1bbd2c9fe"
236
256
  }
237
257
  }
package/core.wasm CHANGED
Binary file