Skip to content

Commit 58a9c49

Browse files
committed
Fix reverse for recursive
1 parent 2dc8bb4 commit 58a9c49

File tree

5 files changed

+55
-39
lines changed

5 files changed

+55
-39
lines changed

packages/tests/src/benchmark/Benchmark.bs.mjs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -212,17 +212,17 @@ console.timeEnd("S.Error.make");
212212

213213
run(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(new (Benchmark.default.Suite)(), "Parse string", (function () {
214214
return function () {
215-
return S$RescriptSchema.unwrap(S$RescriptSchema.parseAnyWith("Hello world!", S$RescriptSchema.string));
215+
return S$RescriptSchema.parseAnyOrRaiseWith("Hello world!", S$RescriptSchema.string);
216216
};
217-
})), "Serialize string", (function () {
217+
})), "Reverse convert string", (function () {
218218
return function () {
219-
return S$RescriptSchema.unwrap(S$RescriptSchema.serializeWith("Hello world!", S$RescriptSchema.string));
219+
return S$RescriptSchema.reverseConvertWith("Hello world!", S$RescriptSchema.string);
220220
};
221221
})).add("Advanced object schema factory", makeAdvancedObjectSchema), "Parse advanced object", (function () {
222222
var schema = makeAdvancedObjectSchema();
223223
var data = makeTestObject();
224224
return function () {
225-
return S$RescriptSchema.unwrap(S$RescriptSchema.parseAnyWith(data, schema));
225+
return S$RescriptSchema.parseAnyOrRaiseWith(data, schema);
226226
};
227227
})), "Assert advanced object - compile", (function () {
228228
var schema = makeAdvancedObjectSchema();
@@ -241,27 +241,27 @@ run(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(addWithPrepare(a
241241
var data = makeTestObject();
242242
return function () {
243243
var schema = makeAdvancedObjectSchema();
244-
return S$RescriptSchema.unwrap(S$RescriptSchema.parseAnyWith(data, schema));
244+
return S$RescriptSchema.parseAnyOrRaiseWith(data, schema);
245245
};
246246
})), "Parse advanced strict object", (function () {
247247
var schema = makeAdvancedStrictObjectSchema();
248248
var data = makeTestObject();
249249
return function () {
250-
return S$RescriptSchema.unwrap(S$RescriptSchema.parseAnyWith(data, schema));
250+
return S$RescriptSchema.parseAnyOrRaiseWith(data, schema);
251251
};
252252
})), "Assert advanced strict object", (function () {
253253
var schema = makeAdvancedStrictObjectSchema();
254254
var data = makeTestObject();
255255
return function () {
256256
S$RescriptSchema.assertWith(data, schema);
257257
};
258-
})), "Serialize advanced object", (function () {
258+
})), "Reverse convert advanced object", (function () {
259259
var schema = makeAdvancedObjectSchema();
260260
var data = makeTestObject();
261261
return function () {
262-
return S$RescriptSchema.unwrap(S$RescriptSchema.serializeWith(data, schema));
262+
return S$RescriptSchema.reverseConvertWith(data, schema);
263263
};
264-
})), "Serialize advanced object - compile", (function () {
264+
})), "Reverse convert advanced object - compile", (function () {
265265
var schema = makeAdvancedObjectSchema();
266266
var data = makeTestObject();
267267
var fn = S$RescriptSchema.compile(S$RescriptSchema.reverse(schema), "Any", "Output", "Sync", false);

packages/tests/src/benchmark/Benchmark.res

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -233,22 +233,22 @@ Suite.make()
233233
let schema = S.string
234234
let data = "Hello world!"
235235
() => {
236-
data->S.parseAnyWith(schema)->S.unwrap
236+
data->S.parseAnyOrRaiseWith(schema)
237237
}
238238
})
239-
->Suite.addWithPrepare("Serialize string", () => {
239+
->Suite.addWithPrepare("Reverse convert string", () => {
240240
let schema = S.string
241241
let data = "Hello world!"
242242
() => {
243-
data->S.serializeWith(schema)->S.unwrap
243+
data->S.reverseConvertWith(schema)
244244
}
245245
})
246246
->Suite.add("Advanced object schema factory", makeAdvancedObjectSchema)
247247
->Suite.addWithPrepare("Parse advanced object", () => {
248248
let schema = makeAdvancedObjectSchema()
249249
let data = makeTestObject()
250250
() => {
251-
data->S.parseAnyWith(schema)->S.unwrap
251+
data->S.parseAnyOrRaiseWith(schema)
252252
}
253253
})
254254
->Suite.addWithPrepare("Assert advanced object - compile", () => {
@@ -270,14 +270,14 @@ Suite.make()
270270
let data = makeTestObject()
271271
() => {
272272
let schema = makeAdvancedObjectSchema()
273-
data->S.parseAnyWith(schema)->S.unwrap
273+
data->S.parseAnyOrRaiseWith(schema)
274274
}
275275
})
276276
->Suite.addWithPrepare("Parse advanced strict object", () => {
277277
let schema = makeAdvancedStrictObjectSchema()
278278
let data = makeTestObject()
279279
() => {
280-
data->S.parseAnyWith(schema)->S.unwrap
280+
data->S.parseAnyOrRaiseWith(schema)
281281
}
282282
})
283283
->Suite.addWithPrepare("Assert advanced strict object", () => {
@@ -287,14 +287,14 @@ Suite.make()
287287
data->S.assertWith(schema)
288288
}
289289
})
290-
->Suite.addWithPrepare("Serialize advanced object", () => {
290+
->Suite.addWithPrepare("Reverse convert advanced object", () => {
291291
let schema = makeAdvancedObjectSchema()
292292
let data = makeTestObject()
293293
() => {
294-
data->S.serializeWith(schema)->S.unwrap
294+
data->S.reverseConvertWith(schema) // FIXME: This is super slow
295295
}
296296
})
297-
->Suite.addWithPrepare("Serialize advanced object - compile", () => {
297+
->Suite.addWithPrepare("Reverse convert advanced object - compile", () => {
298298
let schema = makeAdvancedObjectSchema()
299299
let data = makeTestObject()
300300
let fn =
@@ -318,10 +318,10 @@ serializeWith: 2: 0.004ms
318318
serializeWith: 3: 0.003ms
319319
S.Error.make: 0.029ms
320320
Parse string x 607,790,506 ops/sec ±0.21% (100 runs sampled)
321-
Serialize string x 607,895,909 ops/sec ±0.23% (99 runs sampled)
321+
Reverse convert string x 607,895,909 ops/sec ±0.23% (99 runs sampled)
322322
Advanced object schema factory x 789,559 ops/sec ±0.28% (99 runs sampled)
323323
Parse advanced object x 70,550,720 ops/sec ±0.51% (98 runs sampled)
324324
Create and parse advanced object x 54,592 ops/sec ±0.49% (93 runs sampled)
325325
Parse advanced strict object x 26,614,621 ops/sec ±0.30% (93 runs sampled)
326-
Serialize advanced object x 598,233,913 ops/sec ±0.19% (95 runs sampled)
326+
Reverse convert advanced object x 598,233,913 ops/sec ±0.19% (95 runs sampled)
327327
*/

packages/tests/src/core/S_union_test.res

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -621,6 +621,12 @@ module CrazyUnion = {
621621
~op=#Serialize,
622622
`i=>{let r0=i=>{let v5=i;if(i!=="B"){if(i!=="C"){if(i!=="D"){if(i!=="E"){if(i!=="F"){if(i!=="G"){if(i!=="H"){if(i!=="I"){if(i!=="J"){if(i!=="K"){if(i!=="L"){if(i!=="M"){if(i!=="N"){if(i!=="O"){if(i!=="P"){if(i!=="Q"){if(i!=="R"){if(i!=="S"){if(i!=="T"){if(i!=="U"){if(i!=="V"){if(i!=="W"){if(i!=="X"){if(i!=="Y"){try{let v0=i["_0"],v4=[];if(i["TAG"]!=="A"){e[0](i["TAG"])}for(let v1=0;v1<v0.length;++v1){let v3;try{v3=r0(v0[v1])}catch(v2){if(v2&&v2.s===s){v2.path="[\\"_0\\"]"+\'["\'+v1+\'"]\'+v2.path}throw v2}v4.push(v3)}v5={"type":e[1],"nested":v4}}catch(e0){try{let v6=i["_0"],v10=[];if(i["TAG"]!=="Z"){e[2](i["TAG"])}for(let v7=0;v7<v6.length;++v7){let v9;try{v9=r0(v6[v7])}catch(v8){if(v8&&v8.s===s){v8.path="[\\"_0\\"]"+\'["\'+v7+\'"]\'+v8.path}throw v8}v10.push(v9)}v5={"type":e[3],"nested":v10}}catch(e1){e[4]([e0,e1,])}}}}}}}}}}}}}}}}}}}}}}}}}}return v5};return r0(i)}`,
623623
)
624+
// There was an issue with reverse when it doesn't return the same code on second run
625+
t->U.assertCompiledCode(
626+
~schema,
627+
~op=#Serialize,
628+
`i=>{let r0=i=>{let v5=i;if(i!=="B"){if(i!=="C"){if(i!=="D"){if(i!=="E"){if(i!=="F"){if(i!=="G"){if(i!=="H"){if(i!=="I"){if(i!=="J"){if(i!=="K"){if(i!=="L"){if(i!=="M"){if(i!=="N"){if(i!=="O"){if(i!=="P"){if(i!=="Q"){if(i!=="R"){if(i!=="S"){if(i!=="T"){if(i!=="U"){if(i!=="V"){if(i!=="W"){if(i!=="X"){if(i!=="Y"){try{let v0=i["_0"],v4=[];if(i["TAG"]!=="A"){e[0](i["TAG"])}for(let v1=0;v1<v0.length;++v1){let v3;try{v3=r0(v0[v1])}catch(v2){if(v2&&v2.s===s){v2.path="[\\"_0\\"]"+\'["\'+v1+\'"]\'+v2.path}throw v2}v4.push(v3)}v5={"type":e[1],"nested":v4}}catch(e0){try{let v6=i["_0"],v10=[];if(i["TAG"]!=="Z"){e[2](i["TAG"])}for(let v7=0;v7<v6.length;++v7){let v9;try{v9=r0(v6[v7])}catch(v8){if(v8&&v8.s===s){v8.path="[\\"_0\\"]"+\'["\'+v7+\'"]\'+v8.path}throw v8}v10.push(v9)}v5={"type":e[3],"nested":v10}}catch(e1){e[4]([e0,e1,])}}}}}}}}}}}}}}}}}}}}}}}}}}return v5};return r0(i)}`,
629+
)
624630
})
625631
}
626632

src/S_Core.bs.mjs

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1148,16 +1148,23 @@ function recursive(fn) {
11481148
});
11491149
var initialReverse = schema.r.bind(schema);
11501150
schema.r = (function () {
1151-
var reversed = initialReverse();
1152-
return makeReverseSchema(reversed.n, reversed.t, reversed.m, (function (b, input, selfSchema, path) {
1153-
var bb = scope(b);
1154-
var opOutput = reversed.b(bb, input, selfSchema, "");
1155-
var opBodyCode = allocateScope(bb) + ("return " + inline(b, opOutput));
1156-
b.c = b.c + ("let " + r + "=" + $$var(b, input) + "=>{" + opBodyCode + "};");
1157-
return withPathPrepend(b, input, path, undefined, (function (b, input, param) {
1158-
return map(b, r, input);
1159-
}));
1160-
}), reversed.f);
1151+
var initialReversed = initialReverse();
1152+
var reversed = makeReverseSchema(initialReversed.n, initialReversed.t, initialReversed.m, (function (b, input, selfSchema, path) {
1153+
var bb = scope(b);
1154+
var opOutput = initialReversed.b(bb, input, selfSchema, "");
1155+
var opBodyCode = allocateScope(bb) + ("return " + inline(b, opOutput));
1156+
b.c = b.c + ("let " + r + "=" + $$var(b, input) + "=>{" + opBodyCode + "};");
1157+
return withPathPrepend(b, input, path, undefined, (function (b, input, param) {
1158+
return map(b, r, input);
1159+
}));
1160+
}), initialReversed.f);
1161+
reversed.r = (function () {
1162+
return schema;
1163+
});
1164+
schema.r = (function () {
1165+
return reversed;
1166+
});
1167+
return reversed;
11611168
});
11621169
return schema;
11631170
}

src/S_Core.res

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,7 +1696,7 @@ let recursive = fn => {
16961696
)
16971697
},
16981698
}->Obj.magic
1699-
let schema = fn(placeholder)
1699+
let schema = fn(placeholder)->toUnknown
17001700

17011701
// maybeTypeFilter
17021702
(placeholder->Obj.magic)["f"] = schema.maybeTypeFilter
@@ -1739,23 +1739,26 @@ let recursive = fn => {
17391739

17401740
let initialReverse = (schema.reverse->Obj.magic)["bind"](schema)
17411741
schema.reverse = () => {
1742-
let reversed = initialReverse()
1743-
makeReverseSchema(
1744-
~name=reversed.name,
1745-
~tagged=reversed.tagged,
1746-
~metadataMap=reversed.metadataMap,
1742+
let initialReversed = initialReverse()
1743+
let reversed = makeReverseSchema(
1744+
~name=initialReversed.name,
1745+
~tagged=initialReversed.tagged,
1746+
~metadataMap=initialReversed.metadataMap,
17471747
~builder=Builder.make((b, ~input, ~selfSchema, ~path) => {
17481748
let bb = b->B.scope
1749-
let opOutput = reversed.builder(bb, ~input, ~selfSchema, ~path=Path.empty)
1749+
let opOutput = initialReversed.builder(bb, ~input, ~selfSchema, ~path=Path.empty)
17501750
let opBodyCode = bb->B.allocateScope ++ `return ${b->B.Val.inline(opOutput)}`
17511751
b.code = b.code ++ `let ${r}=${b->B.Val.var(input)}=>{${opBodyCode}};`
17521752
b->B.withPathPrepend(~input, ~path, (b, ~input, ~path as _) => b->B.Val.map(r, input))
17531753
}),
1754-
~maybeTypeFilter=reversed.maybeTypeFilter,
1754+
~maybeTypeFilter=initialReversed.maybeTypeFilter,
17551755
)
1756+
reversed.reverse = () => schema
1757+
schema.reverse = () => reversed
1758+
reversed
17561759
}
17571760

1758-
schema
1761+
schema->castUnknownSchemaToAnySchema
17591762
}
17601763

17611764
let setName = (schema, name) => {

0 commit comments

Comments
 (0)