lawspec 0.9.0 → 0.11.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API-MIGRATION.md +78 -2
- package/HASKELL.md +1 -0
- package/KOTLIN.md +5 -0
- package/LANGUAGE.md +70 -11
- package/NATIVE-BINDINGS.md +1049 -0
- package/PRIMITIVES.md +1 -1
- package/README.md +86 -23
- package/REFINEMENTS.md +6 -1
- package/RELEASE-0.10.md +60 -0
- package/RELEASE-0.11.md +62 -0
- package/api.mjs +23 -3
- package/bin/lawspec.mjs +17 -4
- package/build.json +60 -38
- package/core.wasm +0 -0
- package/examples/native-payments/go/example/payments/domain.go +38 -0
- package/examples/native-payments/go/example/payments/native_generators_test.go +13 -0
- package/examples/native-payments/go/lawspec.json +136 -0
- package/examples/native-payments/haskell/lawspec.json +149 -0
- package/examples/native-payments/haskell/src/PaymentsDomain.hs +21 -0
- package/examples/native-payments/haskell/test/PaymentGenerators.hs +12 -0
- package/examples/native-payments/java/lawspec.json +165 -0
- package/examples/native-payments/java/src/main/java/domain/PaymentsDomain.java +32 -0
- package/examples/native-payments/java/src/test/java/domain/PaymentGenerators.java +16 -0
- package/examples/native-payments/javascript/lawspec.json +149 -0
- package/examples/native-payments/javascript/src/payments_domain.mjs +44 -0
- package/examples/native-payments/javascript/test/lawspec_generators.mjs +6 -0
- package/examples/native-payments/kotlin/lawspec.json +165 -0
- package/examples/native-payments/kotlin/src/main/kotlin/domain/PaymentsDomain.kt +17 -0
- package/examples/native-payments/kotlin/src/test/kotlin/domain/PaymentGenerators.kt +12 -0
- package/examples/native-payments/python/lawspec.json +149 -0
- package/examples/native-payments/python/src/payments_domain.py +60 -0
- package/examples/native-payments/python/tests/lawspec_generators.py +15 -0
- package/examples/native-payments/rust/lawspec.json +167 -0
- package/examples/native-payments/rust/src/domain.rs +37 -0
- package/examples/native-payments/rust/src/lib.rs +2 -0
- package/examples/native-payments/rust/tests/support/lawspec_generators.rs +11 -0
- package/examples/native-payments/typescript/lawspec.json +149 -0
- package/examples/native-payments/typescript/src/payments_domain.ts +42 -0
- package/examples/native-payments/typescript/test/lawspec_generators.ts +8 -0
- package/examples/specs/indexed_families.lawspec +59 -0
- package/examples/specs/payments.lawspec +76 -0
- package/examples-command.mjs +5 -0
- package/files.mjs +6 -6
- package/index.d.ts +53 -2
- package/native-examples.mjs +81 -0
- package/package.json +2 -2
package/build.json
CHANGED
|
@@ -64,27 +64,34 @@
|
|
|
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",
|
|
78
|
+
"src/LawSpec/Indexed.hs",
|
|
76
79
|
"src/LawSpec/Inference.hs",
|
|
77
80
|
"src/LawSpec/JavaData.hs",
|
|
78
81
|
"src/LawSpec/JavaDefinitions.hs",
|
|
79
82
|
"src/LawSpec/JavaExpr.hs",
|
|
83
|
+
"src/LawSpec/JavaNativeBinding.hs",
|
|
80
84
|
"src/LawSpec/JavaProperties.hs",
|
|
81
85
|
"src/LawSpec/JavaTestHelpers.hs",
|
|
82
86
|
"src/LawSpec/KotlinData.hs",
|
|
83
87
|
"src/LawSpec/KotlinDefinitions.hs",
|
|
84
88
|
"src/LawSpec/KotlinExpr.hs",
|
|
89
|
+
"src/LawSpec/KotlinNativeBinding.hs",
|
|
85
90
|
"src/LawSpec/KotlinProperties.hs",
|
|
86
91
|
"src/LawSpec/KotlinTestHelpers.hs",
|
|
87
92
|
"src/LawSpec/Model.hs",
|
|
93
|
+
"src/LawSpec/NativeBinding.hs",
|
|
94
|
+
"src/LawSpec/NativeRequest.hs",
|
|
88
95
|
"src/LawSpec/Parser.hs",
|
|
89
96
|
"src/LawSpec/PortableGenerator.hs",
|
|
90
97
|
"src/LawSpec/PortableTestHelpers.hs",
|
|
@@ -93,6 +100,7 @@
|
|
|
93
100
|
"src/LawSpec/PythonData.hs",
|
|
94
101
|
"src/LawSpec/PythonDefinitions.hs",
|
|
95
102
|
"src/LawSpec/PythonExpr.hs",
|
|
103
|
+
"src/LawSpec/PythonNativeBinding.hs",
|
|
96
104
|
"src/LawSpec/PythonTypes.hs",
|
|
97
105
|
"src/LawSpec/Refinement.hs",
|
|
98
106
|
"src/LawSpec/RuntimeSources.hs",
|
|
@@ -100,12 +108,15 @@
|
|
|
100
108
|
"src/LawSpec/RustDefinitions.hs",
|
|
101
109
|
"src/LawSpec/RustEmit.hs",
|
|
102
110
|
"src/LawSpec/RustExpr.hs",
|
|
111
|
+
"src/LawSpec/RustNativeBinding.hs",
|
|
112
|
+
"src/LawSpec/RustNativeGenerators.hs",
|
|
103
113
|
"src/LawSpec/Scalar.hs",
|
|
104
114
|
"src/LawSpec/SpecializeDefinitions.hs",
|
|
105
115
|
"src/LawSpec/Testing.hs",
|
|
106
116
|
"src/LawSpec/WebData.hs",
|
|
107
117
|
"src/LawSpec/WebDefinitions.hs",
|
|
108
118
|
"src/LawSpec/WebExpr.hs",
|
|
119
|
+
"src/LawSpec/WebNativeBinding.hs",
|
|
109
120
|
"src/LawSpec/WebTypes.hs",
|
|
110
121
|
"stack.yaml",
|
|
111
122
|
"stack.yaml.lock",
|
|
@@ -116,34 +127,34 @@
|
|
|
116
127
|
"wasm/lawspec-wasm.cabal"
|
|
117
128
|
],
|
|
118
129
|
"digests": {
|
|
119
|
-
"lawspec.cabal": "
|
|
120
|
-
"package.yaml": "
|
|
130
|
+
"lawspec.cabal": "e250011f2652a4a00c937de6a46763c51e674859db1bd45228d6c560454fc8ec",
|
|
131
|
+
"package.yaml": "012f2333a714b4a4c542245250cdc1a1da3620215dcb5379eda9f3ffc3067fea",
|
|
121
132
|
"runtime/LawSpecCodecs.hs": "90cb1ed15d7ab664a17a054580c849408d77cfd2b2adcb4a3228b05132caeaca",
|
|
122
|
-
"runtime/LawSpecDataStrategies.hs": "
|
|
123
|
-
"runtime/LawSpecDataStrategies.java": "
|
|
133
|
+
"runtime/LawSpecDataStrategies.hs": "cbe9f1946228db1076c19cd3158e8798fe32766cfdbea3f66b63d22d3d217508",
|
|
134
|
+
"runtime/LawSpecDataStrategies.java": "e3416efe8a0d7b1276cb4d1a8105fd01b1f5f3f02a803bf55d955d9e3ec39095",
|
|
124
135
|
"runtime/LawSpecKotlin.kt": "0cf3b7de0406155225ccca33ee3dfdf8f0456c47d577f6be8f1265c13df838cb",
|
|
125
136
|
"runtime/LawSpecKotlinCodecs.kt": "6210f77dbbe24ba2088db48dae5415abf0993fe552fb3a57d29430807efbc297",
|
|
126
|
-
"runtime/LawSpecKotlinStrategies.kt": "
|
|
137
|
+
"runtime/LawSpecKotlinStrategies.kt": "c07ef4da5ccdab9045f50f08dbfcc4a7349a505af76bd5d3ddc8c00e879437f3",
|
|
127
138
|
"runtime/LawSpecRuntime.hs": "5ced6a6a86a892ae63a544d4c4a4429bf756a730ea786478d820c8070cc96402",
|
|
128
139
|
"runtime/LawSpecRuntime.java": "c7b7cfc9b7c22b082edee14a52d95ef80ebe01ee56988c22702f629ea24b8a4f",
|
|
129
140
|
"runtime/LawSpecSchema.hs": "9912d9f525426a598f9c03c29cfc7bacf80218f73c9d537d8c1257bae245aa33",
|
|
130
141
|
"runtime/LawSpecSchema.java": "885f5f17a9ea1bdb86915dc184aea25b72c3062d6ddb9605530310540b1cc166",
|
|
131
142
|
"runtime/LawSpecStrategies.kt": "569f7775c0ac44765d05567cbf62d026558ac193c080ca71681ec6ee49c21794",
|
|
132
|
-
"runtime/lawspec_codecs.go": "
|
|
133
|
-
"runtime/lawspec_data_strategies.go": "
|
|
134
|
-
"runtime/lawspec_data_strategies.mjs": "
|
|
135
|
-
"runtime/lawspec_data_strategies.py": "
|
|
143
|
+
"runtime/lawspec_codecs.go": "b3024fe60b3b66df9ebffe995ab5bb0294a609a82c611d54957e092eac29f2f5",
|
|
144
|
+
"runtime/lawspec_data_strategies.go": "ec151dbdd1af89f57ce11c10d057d4bbc44691b0472035e0756ced1e0769a640",
|
|
145
|
+
"runtime/lawspec_data_strategies.mjs": "e74a508bf2cd382ad1ca6bc90b6be19b10170e6261dbb902f58522fa2880c2fc",
|
|
146
|
+
"runtime/lawspec_data_strategies.py": "3469bab1af47b5fb9583569d0a07f3c2a0485303d79347afe509cf34b6a21296",
|
|
136
147
|
"runtime/lawspec_runtime.go": "af6ef660387b625b3bb5fcd57f06260c821d4f65eda158db44ad12d66e1d70f8",
|
|
137
148
|
"runtime/lawspec_runtime.mjs": "3b7877c1ee523afba30ed24cd452e2a6126d9e741c7675600e867600d7a73f46",
|
|
138
149
|
"runtime/lawspec_runtime.py": "2f780bc92762eb1115f734a36cc224ae34504929b4ff0ec506735cfa9e3ab02b",
|
|
139
150
|
"runtime/lawspec_runtime.rs": "7ae8afaad638a3d9d6973eebc7cd6daecc8012ec57f3f12ff50cca16e23e15b6",
|
|
140
151
|
"runtime/lawspec_schema.go": "bdfb6f2552bfccf56073d52f7cdbe1d784cba2d956c29762d77df7ad6bba8d67",
|
|
141
|
-
"runtime/lawspec_schema.mjs": "
|
|
142
|
-
"runtime/lawspec_schema.py": "
|
|
143
|
-
"runtime/lawspec_strategies.rs": "
|
|
144
|
-
"runtime/rust/Cargo.lock": "
|
|
145
|
-
"runtime/rust/Cargo.toml": "
|
|
146
|
-
"src/LawSpec/Api.hs": "
|
|
152
|
+
"runtime/lawspec_schema.mjs": "60eb4204461eaa2c207fc7c3394014e2a814e4383b7045c065b4dae7c7a202c2",
|
|
153
|
+
"runtime/lawspec_schema.py": "b6967ef1a33fe6a1a180d5573ec37cd8bb2079c06e961ac2eeb05f23cffcdd07",
|
|
154
|
+
"runtime/lawspec_strategies.rs": "cac9ca301d4614fff9acfe61e7cc5678fabc044edadfa89ec11599b6780dc5f3",
|
|
155
|
+
"runtime/rust/Cargo.lock": "a541c57b690f3ece7c0aecb3aef3f1a991a760d3aa04018a8bec9d4567978170",
|
|
156
|
+
"runtime/rust/Cargo.toml": "6929f520456dcb6a702bcf40df08c8caeaee41b304b06deb07f86221d378e940",
|
|
157
|
+
"src/LawSpec/Api.hs": "392f6e8c1a9ae81a95e219ac071e5b4bea03ee330d63b829036f8f54b2eda8a7",
|
|
147
158
|
"src/LawSpec/Backend.hs": "03c3b0cd62467ca677c88d29d7b12b2ab505cc0076d93d1f48fbddb0e9bcf133",
|
|
148
159
|
"src/LawSpec/Capabilities.hs": "e43d4fc3a4481fbb8aa3ff1c3f41f7e7fca5db01bfe256a30162a45d75a00c1c",
|
|
149
160
|
"src/LawSpec/Code/Doc.hs": "9e3b70f85deb1dcbce385af1d0cd4bea2dfa8a2d806d54745d4bb437406673e5",
|
|
@@ -162,12 +173,12 @@
|
|
|
162
173
|
"src/LawSpec/Core/Semantics.hs": "a9d019433e3b9731f8cd0f65ec0ccc53179824bea58247b72df26760b878c2b6",
|
|
163
174
|
"src/LawSpec/Core/Total.hs": "95d2b19ba7fbfd033295504d31f786815384003b3b4d370776860b423cf079dd",
|
|
164
175
|
"src/LawSpec/Core/Totality.hs": "8f5b5d69f4baaba45301899ef568cbe90133943c3771ba78d492424e9725e7a7",
|
|
165
|
-
"src/LawSpec/Core/Types.hs": "
|
|
176
|
+
"src/LawSpec/Core/Types.hs": "48ed1d197ce7089737895b7279f93437301fcfacff8b3a8dd98ecd7f1cb32b37",
|
|
166
177
|
"src/LawSpec/Core/Validate.hs": "0f045241215e068081d6cd7cf451f0166671bae5fffafda71a2e2320e8014c27",
|
|
167
178
|
"src/LawSpec/Core/Value.hs": "f2b2e4d82491e184d60b1217922b25c57a06cbbaecb2cb6f31174af50268fbc9",
|
|
168
|
-
"src/LawSpec/CoreEmit.hs": "
|
|
169
|
-
"src/LawSpec/CoreNativeScalarEmit.hs": "
|
|
170
|
-
"src/LawSpec/CoreScalarEmit.hs": "
|
|
179
|
+
"src/LawSpec/CoreEmit.hs": "075f06ef1be2437542967b171c535686f33ed4645f6525a93c1024a9fbf68582",
|
|
180
|
+
"src/LawSpec/CoreNativeScalarEmit.hs": "4082661ba5f8b1b09b4811f62ba767fa1ea401a38dd10011aea442c5a27892af",
|
|
181
|
+
"src/LawSpec/CoreScalarEmit.hs": "d1a51f7fe9b23817eeac7b50dac70ec02219df66d4b0218c5c9ae5237da244fd",
|
|
171
182
|
"src/LawSpec/Data.hs": "9dbeafa120276b114dad790ec69e617f7ad0c632e3c718962f2f7faf8ca327f4",
|
|
172
183
|
"src/LawSpec/DefinitionTotality.hs": "7671b7efb0cac5d796b074d48b2c10940e5bd0b5df082b926aee694903285efa",
|
|
173
184
|
"src/LawSpec/Domain.hs": "222d15f0012ae630802238a6d7e1ee78d1e718b599f5ebb5a1ddc4e8d29d68c3",
|
|
@@ -175,32 +186,39 @@
|
|
|
175
186
|
"src/LawSpec/Emit.hs": "9f34f5765915a2a12a66a6dca647ddaef9289372956802c6d99cf0cfec447c7a",
|
|
176
187
|
"src/LawSpec/Eval.hs": "b0872ba8a6974463b32776653c2939826a6be87318c15641401f913f6b139de2",
|
|
177
188
|
"src/LawSpec/Frontend.hs": "fbf091b9c96f5b5361dbf4f65819634c0f8526ff98550d97c434c0d47af7839e",
|
|
178
|
-
"src/LawSpec/Gen.hs": "
|
|
179
|
-
"src/LawSpec/GoData.hs": "
|
|
189
|
+
"src/LawSpec/Gen.hs": "c76d00fb1f7e9ed2eed7d387f1cd86cf4d12cc57f007abb0e479043b0ed377e6",
|
|
190
|
+
"src/LawSpec/GoData.hs": "35efbfdc1079e777d4760069fa2405a9700bbabab7dc7e3c2c5e0757312ea201",
|
|
180
191
|
"src/LawSpec/GoDefinitions.hs": "09e9e4b60cfea893d35589cd18bc8a6099789d81e0f57ae5cb018bd95bd4838b",
|
|
181
192
|
"src/LawSpec/GoExpr.hs": "da3a7cc0e3d2906886dc44f6b990e72098bb351558bbb31ee335da7382fac58a",
|
|
182
|
-
"src/LawSpec/
|
|
193
|
+
"src/LawSpec/GoNativeBinding.hs": "1ad8ea4cec6187c7e6005651c0edeec69e196eb329fb958c833da7751225aa1b",
|
|
194
|
+
"src/LawSpec/GoProperties.hs": "1eee75d852b0a1f8b6fe2cfb1cd3ed7dc57f44ca0ee137697729e8e1583d85fe",
|
|
183
195
|
"src/LawSpec/GoTestHelpers.hs": "dee55ee8505370e932773b8c685f4a1f380129e6f43f8806bf1e82efb99451b1",
|
|
184
196
|
"src/LawSpec/GoTypeRefs.hs": "7f239f5ac3ac8bd21c8f76c328049f7715d8562ee1382befa0a58abd4f15f726",
|
|
185
|
-
"src/LawSpec/HaskellData.hs": "
|
|
197
|
+
"src/LawSpec/HaskellData.hs": "51374f35de2b1d6c78d15597e41e6f0695fe5fdb040cbb35a7d03d23fa3a3179",
|
|
186
198
|
"src/LawSpec/HaskellDefinitions.hs": "535a8d644d5ddb98c22fa6bdf34cf2baa787aa1f5b900815c621d0d65ede0f0f",
|
|
187
199
|
"src/LawSpec/HaskellExpr.hs": "f4144cf2022ef0a3bec6d796ebe7d2f42563e9d25758b9f362cd5545b47e802b",
|
|
188
|
-
"src/LawSpec/
|
|
200
|
+
"src/LawSpec/HaskellNativeBinding.hs": "9f98aa0c8659b572bd6486a0e29c4692bc6432db8639fa74a09bbf1b771bbfa6",
|
|
201
|
+
"src/LawSpec/HaskellProperties.hs": "5d64d5f45b86b5bb148383588d69ad717b0e158926b76938cc5cef54ed3adecc",
|
|
189
202
|
"src/LawSpec/HaskellTestHelpers.hs": "51e59b2abc9e85455e3c8e2c6baadb27e5d319081cb730d2ce56be5dc8053897",
|
|
190
203
|
"src/LawSpec/HaskellTypeRefs.hs": "2225b2a5e2ab3662e7202d23b24f4d6db48353b35ae28df8acd2b92fd2b97574",
|
|
204
|
+
"src/LawSpec/Indexed.hs": "bfb24a4023517acf9f34e6f3327c5623f0e18b1576e5453a43d7a6cd9e691e00",
|
|
191
205
|
"src/LawSpec/Inference.hs": "78285145897f03c3c4adc37acf0f490ea779bab3975fb2830628dae3a152fe38",
|
|
192
|
-
"src/LawSpec/JavaData.hs": "
|
|
206
|
+
"src/LawSpec/JavaData.hs": "177713377f7a38d69fbfd7891899357fc55782cf1d361f2e9dd5baf8725d4067",
|
|
193
207
|
"src/LawSpec/JavaDefinitions.hs": "9c0fe11bd4849af09bbe3d941d89ba609a2dabecdc1c8b09b6ddbf69671c8f92",
|
|
194
208
|
"src/LawSpec/JavaExpr.hs": "6f237b0fc1eabe2d53c160f4cb781f8b77b478383f1a77ca4ccc8f08ac0dbcd0",
|
|
195
|
-
"src/LawSpec/
|
|
209
|
+
"src/LawSpec/JavaNativeBinding.hs": "8abbae78959a5cb61b7c6ae1c9071e43d10e26c2f421766d431fa18031f87173",
|
|
210
|
+
"src/LawSpec/JavaProperties.hs": "d953771df667aa193b110dbc898b0936b9ff5a32f6ebc9d2ff25d44a6cd4dfec",
|
|
196
211
|
"src/LawSpec/JavaTestHelpers.hs": "e6f4b9bbb7e5f07ece6ab1845e12aa661e62e8b926680b11454223fc3ec1523d",
|
|
197
|
-
"src/LawSpec/KotlinData.hs": "
|
|
212
|
+
"src/LawSpec/KotlinData.hs": "7785fc0c091e50010bce3002355f01c1d237fce05bca6a7ce6de6d207737e228",
|
|
198
213
|
"src/LawSpec/KotlinDefinitions.hs": "97d7d407d4bbdb4ce16035d607dbbcb8e3d6f5db513f2123a2c269e3dc6d2b38",
|
|
199
214
|
"src/LawSpec/KotlinExpr.hs": "20312f0774f1d0832a21a19b93c8103e2791ecd32a827d8e9c4f2b4830a996a0",
|
|
200
|
-
"src/LawSpec/
|
|
215
|
+
"src/LawSpec/KotlinNativeBinding.hs": "1aec7854758f07a4d2288de13931fbb88ef32220f85d3c84fe8233ad67b6d095",
|
|
216
|
+
"src/LawSpec/KotlinProperties.hs": "ee8c68bc5ee10a601a643356edb1e0a0c50d6e72a4520feaccb716c6f02ac99c",
|
|
201
217
|
"src/LawSpec/KotlinTestHelpers.hs": "74810d65faafc6ed4d64b1fb0596cda4186e586b7144a7441641b798795bc324",
|
|
202
218
|
"src/LawSpec/Model.hs": "1d7ceb7bd66e3d496eef89eaa86403e6896472317ca9a4be86e0c933a7cce403",
|
|
203
|
-
"src/LawSpec/
|
|
219
|
+
"src/LawSpec/NativeBinding.hs": "33959b0fd432ad4150f3b685f6438e284b801c2a59d9ef3132486a1cc7c8925a",
|
|
220
|
+
"src/LawSpec/NativeRequest.hs": "fb2dc88f42424ca520533700eab68c407a5de83807d1b0d8c976e6c4f3d65212",
|
|
221
|
+
"src/LawSpec/Parser.hs": "7b11b5cbdc89a2f706623929dbdc61df84e003fac2b48b3bbafee1e2cb87a025",
|
|
204
222
|
"src/LawSpec/PortableGenerator.hs": "69d457e39f539c77fc7a4c08205e75352bbecd9dfdff031a283a39bf44b22d49",
|
|
205
223
|
"src/LawSpec/PortableTestHelpers.hs": "8ba4d87183c8c11f6ef1ce21c170127335797154f29fb97ad3429f032a167fd3",
|
|
206
224
|
"src/LawSpec/Prelude.hs": "b1e155c12f58e7c346551a0c65c5d5af76d045b3f1625977ca2a5d1c97cb8c46",
|
|
@@ -208,19 +226,23 @@
|
|
|
208
226
|
"src/LawSpec/PythonData.hs": "07e9bb54a1515f3f4744b7b9bb43633cbdbf07b3f9e35efef511753f97e216d5",
|
|
209
227
|
"src/LawSpec/PythonDefinitions.hs": "bc7b971be97339f2d9e4962ad98100878266176aeccd2a9dfd014e2db9550bd8",
|
|
210
228
|
"src/LawSpec/PythonExpr.hs": "23d7d24b5fb4efff9cb63d38c02a93d95744ec79b4565daf1412088fc7c4ba59",
|
|
229
|
+
"src/LawSpec/PythonNativeBinding.hs": "4e35ff8781062d0f614e45ea45f98038c8d609ab78bd671cb0a239eaa9db1690",
|
|
211
230
|
"src/LawSpec/PythonTypes.hs": "ef928bfeb4324eb6e53c99cae247cc2fa84816075d81de4589d14abaa326656a",
|
|
212
231
|
"src/LawSpec/Refinement.hs": "8058a9f7e433b4b00ef0966a9ea2be3c91ae93b591ed58a1ffcb792d316193d3",
|
|
213
|
-
"src/LawSpec/RuntimeSources.hs": "
|
|
214
|
-
"src/LawSpec/RustData.hs": "
|
|
232
|
+
"src/LawSpec/RuntimeSources.hs": "22c9f7e4f977b4f548363f494c9d66edeb4d3247c7a1e7e7cad470b1059019be",
|
|
233
|
+
"src/LawSpec/RustData.hs": "8fda864335ccb5478c39f56cb714d5275edf36fcbdc2d152bbe94960b644ad98",
|
|
215
234
|
"src/LawSpec/RustDefinitions.hs": "5d0328a8b17e0cb5067f65d23f0f2cd2a96b92e4b1c3d6e22b7cb08255697177",
|
|
216
|
-
"src/LawSpec/RustEmit.hs": "
|
|
235
|
+
"src/LawSpec/RustEmit.hs": "0687d8589940e7b39daa953c439009d1416eba7da54e9936d2f5595316744d21",
|
|
217
236
|
"src/LawSpec/RustExpr.hs": "04b2ef81417b811c7b98a98acdadab4e588ca8757964a63ba8dc5936c36479e6",
|
|
237
|
+
"src/LawSpec/RustNativeBinding.hs": "9d08348da571ac335e335e48c1ad4a67108f7bca54119f5960480e97a6d1da84",
|
|
238
|
+
"src/LawSpec/RustNativeGenerators.hs": "a3b1484d9ff0008e4f961aa81d0aa51da57ec0cd7909124e80c98d56aacc8ce9",
|
|
218
239
|
"src/LawSpec/Scalar.hs": "52e61fec81a337bb5b35e9e6f501446cf0b18bffa6c6af2ddc5aeac2d6e07131",
|
|
219
240
|
"src/LawSpec/SpecializeDefinitions.hs": "08f2fe674a5e00d1be396d9edab0dd2c948b7beb12fa99f2a6aba00cbdf01e33",
|
|
220
|
-
"src/LawSpec/Testing.hs": "
|
|
221
|
-
"src/LawSpec/WebData.hs": "
|
|
241
|
+
"src/LawSpec/Testing.hs": "7b0a2e58bcef24365883b479b6a5af720cc2ac4c217ae23bb771c2621d82aec3",
|
|
242
|
+
"src/LawSpec/WebData.hs": "919af27be12f63f17762e0c052341ab82dcee5d45951a4fd9c66abead98d1ee0",
|
|
222
243
|
"src/LawSpec/WebDefinitions.hs": "fd985db70c778c8014b780666ac327018e05260be610fa717b8c5477ba9638b4",
|
|
223
244
|
"src/LawSpec/WebExpr.hs": "0389dcd5cf7479dd23ef034b1012de6ebd70bf1dc9e3d90981dfb0ba2702596f",
|
|
245
|
+
"src/LawSpec/WebNativeBinding.hs": "465251be1a93d24a775aa57955bb9ec612af7364c53c83017da051f44943eda9",
|
|
224
246
|
"src/LawSpec/WebTypes.hs": "f77ffee1e0c7929964a889fb252c1c5d0977afed94664ffcb0f8770c37b98c70",
|
|
225
247
|
"stack.yaml": "20ccf4d599e355e60b7aa4f814a7cd4299fe2048616cc2e6dbdc22a7bd8cec73",
|
|
226
248
|
"stack.yaml.lock": "ae222b9c81af920c56e50fa4596fa57786e7fa5a7b461390362b2b2ff63818c7",
|
|
@@ -228,10 +250,10 @@
|
|
|
228
250
|
"wasm/app/Exports.hs": "4ecbdac8faa2449e6fc61b93c82e6278fa14374154f29b4dacf0eef433f06a47",
|
|
229
251
|
"wasm/cabal.project": "021e560afdc5eb4cb7169e7119ecb8f92c9ee170245af909c94b612941bff5cc",
|
|
230
252
|
"wasm/cabal.project.freeze": "733dbed3d2ecccb26e874fd58f136296dad772184deb1658c196b5d54a0814dc",
|
|
231
|
-
"wasm/lawspec-wasm.cabal": "
|
|
232
|
-
"npm/core.wasm": "
|
|
253
|
+
"wasm/lawspec-wasm.cabal": "01198a858a300d47ea5a9d766523ab577092add5139d09333dbe6fbbf1834c5b",
|
|
254
|
+
"npm/core.wasm": "ecf8b4ee304838dd5ea7d9b708dd6e4c2572f76d60e3ac346b3c740b8f0318e7",
|
|
233
255
|
"npm/core_jsffi.js": "88d136efe92f7cff5758c8fec8d9b6bbc9707fe37741cebeeb415fe34ce3d72b",
|
|
234
|
-
"npm/api.mjs": "
|
|
235
|
-
"npm/index.d.ts": "
|
|
256
|
+
"npm/api.mjs": "e93251db289ff0609abaff78ad67f0a9af82508c1141c6a999604f67c56b6e7d",
|
|
257
|
+
"npm/index.d.ts": "2674f8830bd20a2b9ef7dfa99e183598125b6bcc17e8d454e8f7cca1bbd2c9fe"
|
|
236
258
|
}
|
|
237
259
|
}
|
package/core.wasm
CHANGED
|
Binary file
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
package payments
|
|
2
|
+
|
|
3
|
+
import "math/big"
|
|
4
|
+
|
|
5
|
+
// Application-owned domain types, separate from generated canonical types.
|
|
6
|
+
type CurrencyCode int
|
|
7
|
+
|
|
8
|
+
const (
|
|
9
|
+
Dollars CurrencyCode = iota
|
|
10
|
+
Euros
|
|
11
|
+
Pounds
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
type Price struct {
|
|
15
|
+
Major LawSpecDecimal
|
|
16
|
+
Unit CurrencyCode
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
type PaymentStatus interface{ payment() }
|
|
20
|
+
type Settled struct{ Price Price }
|
|
21
|
+
type Rejected struct{ Explanation string }
|
|
22
|
+
|
|
23
|
+
func (Settled) payment() {}
|
|
24
|
+
func (Rejected) payment() {}
|
|
25
|
+
|
|
26
|
+
// AddFee uses independent exact integer arithmetic, without ambient rounding.
|
|
27
|
+
func AddFee(price Price) Price {
|
|
28
|
+
exponent := min(price.Major.exponent, -1)
|
|
29
|
+
power := func(n int) *big.Int {
|
|
30
|
+
return new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(n)), nil)
|
|
31
|
+
}
|
|
32
|
+
amount := new(big.Int).Mul(price.Major.coefficient, power(price.Major.exponent-exponent))
|
|
33
|
+
fee := new(big.Int).Mul(big.NewInt(2), power(-1-exponent))
|
|
34
|
+
return Price{LawSpecDecimal{new(big.Int).Add(amount, fee), exponent}, price.Unit}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
func Restore(value PaymentStatus) PaymentStatus { return value }
|
|
38
|
+
func Store(values []LawSpecMaybe[PaymentStatus]) []LawSpecMaybe[PaymentStatus] { return values }
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
package payments
|
|
2
|
+
|
|
3
|
+
import (
|
|
4
|
+
"math/big"
|
|
5
|
+
|
|
6
|
+
"pgregory.net/rapid"
|
|
7
|
+
)
|
|
8
|
+
|
|
9
|
+
func NativePrices() *rapid.Generator[Price] {
|
|
10
|
+
return rapid.Map(rapid.IntRange(100, 200), func(cents int) Price {
|
|
11
|
+
return Price{LawSpecDecimal{big.NewInt(int64(cents)), -2}, Euros}
|
|
12
|
+
})
|
|
13
|
+
}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"sources": [
|
|
4
|
+
"laws"
|
|
5
|
+
],
|
|
6
|
+
"machineBits": 64,
|
|
7
|
+
"targets": [
|
|
8
|
+
{
|
|
9
|
+
"language": "go",
|
|
10
|
+
"root": ".",
|
|
11
|
+
"nativeBindings": {
|
|
12
|
+
"types": [
|
|
13
|
+
{
|
|
14
|
+
"type": "example.payments::type::Currency",
|
|
15
|
+
"native": [
|
|
16
|
+
"CurrencyCode"
|
|
17
|
+
],
|
|
18
|
+
"constructors": [
|
|
19
|
+
{
|
|
20
|
+
"constructor": "USD",
|
|
21
|
+
"native": [
|
|
22
|
+
"Dollars"
|
|
23
|
+
],
|
|
24
|
+
"style": "unit",
|
|
25
|
+
"fields": []
|
|
26
|
+
},
|
|
27
|
+
{
|
|
28
|
+
"constructor": "EUR",
|
|
29
|
+
"native": [
|
|
30
|
+
"Euros"
|
|
31
|
+
],
|
|
32
|
+
"style": "unit",
|
|
33
|
+
"fields": []
|
|
34
|
+
},
|
|
35
|
+
{
|
|
36
|
+
"constructor": "GBP",
|
|
37
|
+
"native": [
|
|
38
|
+
"Pounds"
|
|
39
|
+
],
|
|
40
|
+
"style": "unit",
|
|
41
|
+
"fields": []
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"type": "example.payments::type::Money",
|
|
47
|
+
"native": [
|
|
48
|
+
"Price"
|
|
49
|
+
],
|
|
50
|
+
"constructors": [
|
|
51
|
+
{
|
|
52
|
+
"constructor": "Money",
|
|
53
|
+
"native": [
|
|
54
|
+
"Price"
|
|
55
|
+
],
|
|
56
|
+
"style": "record",
|
|
57
|
+
"fields": [
|
|
58
|
+
{
|
|
59
|
+
"field": "amount",
|
|
60
|
+
"native": "Major"
|
|
61
|
+
},
|
|
62
|
+
{
|
|
63
|
+
"field": "currency",
|
|
64
|
+
"native": "Unit"
|
|
65
|
+
}
|
|
66
|
+
]
|
|
67
|
+
}
|
|
68
|
+
]
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
"type": "example.payments::type::Payment",
|
|
72
|
+
"native": [
|
|
73
|
+
"PaymentStatus"
|
|
74
|
+
],
|
|
75
|
+
"constructors": [
|
|
76
|
+
{
|
|
77
|
+
"constructor": "Paid",
|
|
78
|
+
"native": [
|
|
79
|
+
"Settled"
|
|
80
|
+
],
|
|
81
|
+
"style": "variant",
|
|
82
|
+
"fields": [
|
|
83
|
+
{
|
|
84
|
+
"field": "value",
|
|
85
|
+
"native": "Price"
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
},
|
|
89
|
+
{
|
|
90
|
+
"constructor": "Declined",
|
|
91
|
+
"native": [
|
|
92
|
+
"Rejected"
|
|
93
|
+
],
|
|
94
|
+
"style": "variant",
|
|
95
|
+
"fields": [
|
|
96
|
+
{
|
|
97
|
+
"field": "reason",
|
|
98
|
+
"native": "Explanation"
|
|
99
|
+
}
|
|
100
|
+
]
|
|
101
|
+
}
|
|
102
|
+
]
|
|
103
|
+
}
|
|
104
|
+
],
|
|
105
|
+
"functions": [
|
|
106
|
+
{
|
|
107
|
+
"declaration": "example.payments::addFee",
|
|
108
|
+
"native": [
|
|
109
|
+
"AddFee"
|
|
110
|
+
]
|
|
111
|
+
},
|
|
112
|
+
{
|
|
113
|
+
"declaration": "example.payments::roundTrip",
|
|
114
|
+
"native": [
|
|
115
|
+
"Restore"
|
|
116
|
+
]
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"declaration": "example.payments::archive",
|
|
120
|
+
"native": [
|
|
121
|
+
"Store"
|
|
122
|
+
]
|
|
123
|
+
}
|
|
124
|
+
],
|
|
125
|
+
"generators": [
|
|
126
|
+
{
|
|
127
|
+
"type": "example.payments::type::Money",
|
|
128
|
+
"factory": [
|
|
129
|
+
"NativePrices"
|
|
130
|
+
]
|
|
131
|
+
}
|
|
132
|
+
]
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
]
|
|
136
|
+
}
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 1,
|
|
3
|
+
"sources": [
|
|
4
|
+
"laws"
|
|
5
|
+
],
|
|
6
|
+
"machineBits": 64,
|
|
7
|
+
"targets": [
|
|
8
|
+
{
|
|
9
|
+
"language": "haskell",
|
|
10
|
+
"root": ".",
|
|
11
|
+
"nativeBindings": {
|
|
12
|
+
"types": [
|
|
13
|
+
{
|
|
14
|
+
"type": "example.payments::type::Currency",
|
|
15
|
+
"native": [
|
|
16
|
+
"PaymentsDomain",
|
|
17
|
+
"CurrencyCode"
|
|
18
|
+
],
|
|
19
|
+
"constructors": [
|
|
20
|
+
{
|
|
21
|
+
"constructor": "USD",
|
|
22
|
+
"native": [
|
|
23
|
+
"PaymentsDomain",
|
|
24
|
+
"Dollars"
|
|
25
|
+
],
|
|
26
|
+
"style": "unit",
|
|
27
|
+
"fields": []
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"constructor": "EUR",
|
|
31
|
+
"native": [
|
|
32
|
+
"PaymentsDomain",
|
|
33
|
+
"Euros"
|
|
34
|
+
],
|
|
35
|
+
"style": "unit",
|
|
36
|
+
"fields": []
|
|
37
|
+
},
|
|
38
|
+
{
|
|
39
|
+
"constructor": "GBP",
|
|
40
|
+
"native": [
|
|
41
|
+
"PaymentsDomain",
|
|
42
|
+
"Pounds"
|
|
43
|
+
],
|
|
44
|
+
"style": "unit",
|
|
45
|
+
"fields": []
|
|
46
|
+
}
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
"type": "example.payments::type::Money",
|
|
51
|
+
"native": [
|
|
52
|
+
"PaymentsDomain",
|
|
53
|
+
"Price"
|
|
54
|
+
],
|
|
55
|
+
"constructors": [
|
|
56
|
+
{
|
|
57
|
+
"constructor": "Money",
|
|
58
|
+
"native": [
|
|
59
|
+
"PaymentsDomain",
|
|
60
|
+
"Price"
|
|
61
|
+
],
|
|
62
|
+
"style": "record",
|
|
63
|
+
"fields": [
|
|
64
|
+
{
|
|
65
|
+
"field": "amount",
|
|
66
|
+
"native": "major"
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
"field": "currency",
|
|
70
|
+
"native": "unit"
|
|
71
|
+
}
|
|
72
|
+
]
|
|
73
|
+
}
|
|
74
|
+
]
|
|
75
|
+
},
|
|
76
|
+
{
|
|
77
|
+
"type": "example.payments::type::Payment",
|
|
78
|
+
"native": [
|
|
79
|
+
"PaymentsDomain",
|
|
80
|
+
"PaymentStatus"
|
|
81
|
+
],
|
|
82
|
+
"constructors": [
|
|
83
|
+
{
|
|
84
|
+
"constructor": "Paid",
|
|
85
|
+
"native": [
|
|
86
|
+
"PaymentsDomain",
|
|
87
|
+
"Settled"
|
|
88
|
+
],
|
|
89
|
+
"style": "variant",
|
|
90
|
+
"fields": [
|
|
91
|
+
{
|
|
92
|
+
"field": "value",
|
|
93
|
+
"native": "price"
|
|
94
|
+
}
|
|
95
|
+
]
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"constructor": "Declined",
|
|
99
|
+
"native": [
|
|
100
|
+
"PaymentsDomain",
|
|
101
|
+
"Rejected"
|
|
102
|
+
],
|
|
103
|
+
"style": "variant",
|
|
104
|
+
"fields": [
|
|
105
|
+
{
|
|
106
|
+
"field": "reason",
|
|
107
|
+
"native": "explanation"
|
|
108
|
+
}
|
|
109
|
+
]
|
|
110
|
+
}
|
|
111
|
+
]
|
|
112
|
+
}
|
|
113
|
+
],
|
|
114
|
+
"functions": [
|
|
115
|
+
{
|
|
116
|
+
"declaration": "example.payments::addFee",
|
|
117
|
+
"native": [
|
|
118
|
+
"PaymentsDomain",
|
|
119
|
+
"addFee"
|
|
120
|
+
]
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"declaration": "example.payments::roundTrip",
|
|
124
|
+
"native": [
|
|
125
|
+
"PaymentsDomain",
|
|
126
|
+
"restore"
|
|
127
|
+
]
|
|
128
|
+
},
|
|
129
|
+
{
|
|
130
|
+
"declaration": "example.payments::archive",
|
|
131
|
+
"native": [
|
|
132
|
+
"PaymentsDomain",
|
|
133
|
+
"store"
|
|
134
|
+
]
|
|
135
|
+
}
|
|
136
|
+
],
|
|
137
|
+
"generators": [
|
|
138
|
+
{
|
|
139
|
+
"type": "example.payments::type::Money",
|
|
140
|
+
"factory": [
|
|
141
|
+
"PaymentGenerators",
|
|
142
|
+
"prices"
|
|
143
|
+
]
|
|
144
|
+
}
|
|
145
|
+
]
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
]
|
|
149
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
module PaymentsDomain where
|
|
2
|
+
|
|
3
|
+
import Data.Ratio ((%))
|
|
4
|
+
import Data.Text (Text)
|
|
5
|
+
import LawSpecRuntime (Decimal(..))
|
|
6
|
+
|
|
7
|
+
data CurrencyCode = Dollars | Euros | Pounds deriving (Eq, Show)
|
|
8
|
+
-- Deliberately reverse the logical field order.
|
|
9
|
+
data Price = Price { unit :: CurrencyCode, major :: Decimal } deriving (Eq, Show)
|
|
10
|
+
data PaymentStatus = Settled { price :: Price } | Rejected { explanation :: Text }
|
|
11
|
+
deriving (Eq, Show)
|
|
12
|
+
|
|
13
|
+
addFee :: Price -> Price
|
|
14
|
+
addFee value = case major value of
|
|
15
|
+
Decimal amount -> value { major = Decimal (amount + 1 % 5) }
|
|
16
|
+
|
|
17
|
+
restore :: PaymentStatus -> PaymentStatus
|
|
18
|
+
restore value = value
|
|
19
|
+
|
|
20
|
+
store :: [Maybe PaymentStatus] -> [Maybe PaymentStatus]
|
|
21
|
+
store values = values
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
module PaymentGenerators where
|
|
2
|
+
|
|
3
|
+
import Data.Ratio ((%))
|
|
4
|
+
import Hedgehog (Gen)
|
|
5
|
+
import qualified Hedgehog.Gen as Gen
|
|
6
|
+
import qualified Hedgehog.Range as Range
|
|
7
|
+
import LawSpecRuntime (Decimal(..))
|
|
8
|
+
import PaymentsDomain
|
|
9
|
+
|
|
10
|
+
prices :: Gen Price
|
|
11
|
+
prices = (\cents -> Price Euros (Decimal (cents % 100))) <$>
|
|
12
|
+
Gen.integral (Range.linear 100 200)
|