Skip to content

Commit 4496782

Browse files
committed
Add pipe chaining test
1 parent 592f244 commit 4496782

File tree

2 files changed

+40
-6
lines changed

2 files changed

+40
-6
lines changed

tests/tests/src/option_stdlib_optimization_test.mjs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,23 @@
33
import * as Mocha from "mocha";
44
import * as Test_utils from "./test_utils.mjs";
55
import * as Stdlib_Option from "@rescript/runtime/lib/es6/Stdlib_Option.js";
6+
import * as Belt_MapString from "@rescript/runtime/lib/es6/Belt_MapString.js";
67
import * as Primitive_option from "@rescript/runtime/lib/es6/Primitive_option.js";
78

9+
function getIncidentCategoryName(incidents, categories, incidentId) {
10+
let incident = incidentId !== undefined ? Belt_MapString.get(incidents, incidentId) : undefined;
11+
let categoryId = incident !== undefined ? incident.categoryId : undefined;
12+
let category = categoryId !== undefined ? Belt_MapString.get(categories, categoryId) : undefined;
13+
if (category !== undefined) {
14+
return category.name;
15+
}
16+
17+
}
18+
19+
let PipeChain = {
20+
getIncidentCategoryName: getIncidentCategoryName
21+
};
22+
823
function testPrimitive() {
924
console.log(42);
1025
}
@@ -348,12 +363,12 @@ Mocha.describe("Scope preservation in Option optimizations", () => {
348363
return _value => {};
349364
};
350365
Stdlib_Option.forEach(undefined, makeCallback());
351-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 337, characters 7-14", invocations.contents, 1);
366+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 481, characters 7-14", invocations.contents, 1);
352367
});
353368
Mocha.test("Option.forEach does not shadow surrounding bindings", () => {
354369
let result;
355370
result = 89 + 1 | 0;
356-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 350, characters 7-14", result, 90);
371+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 494, characters 7-14", result, 90);
357372
});
358373
Mocha.test("Option.map evaluates callback argument even when option is None", () => {
359374
let invocations = {
@@ -364,11 +379,11 @@ Mocha.describe("Scope preservation in Option optimizations", () => {
364379
return value => value;
365380
};
366381
Stdlib_Option.map(undefined, makeCallback());
367-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 362, characters 7-14", invocations.contents, 1);
382+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 506, characters 7-14", invocations.contents, 1);
368383
});
369384
Mocha.test("Option.map does not shadow surrounding bindings", () => {
370385
let result = 89 + 1 | 0;
371-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 368, characters 7-14", result, 90);
386+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 512, characters 7-14", result, 90);
372387
});
373388
Mocha.test("Option.flatMap evaluates callback argument even when option is None", () => {
374389
let invocations = {
@@ -379,18 +394,19 @@ Mocha.describe("Scope preservation in Option optimizations", () => {
379394
return value => Primitive_option.some(value);
380395
};
381396
Stdlib_Option.flatMap(undefined, makeCallback());
382-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 380, characters 7-14", invocations.contents, 1);
397+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 524, characters 7-14", invocations.contents, 1);
383398
});
384399
Mocha.test("Option.flatMap does not shadow surrounding bindings", () => {
385400
let result = 89 + 1 | 0;
386-
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 386, characters 7-14", result, 90);
401+
Test_utils.eq("File \"option_stdlib_optimization_test.res\", line 530, characters 7-14", result, 90);
387402
});
388403
});
389404

390405
let globalValue = 89;
391406

392407
export {
393408
globalValue,
409+
PipeChain,
394410
ForEach,
395411
$$Map,
396412
FlatMap,

tests/tests/src/option_stdlib_optimization_test.res

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,24 @@ open Test_utils
77

88
let globalValue = 89
99

10+
module PipeChain = {
11+
// Modeled after some real world code that chains a lot of
12+
// Option.flatMap/Option.map calls.
13+
type incident = {incidentId: string, categoryId: option<string>}
14+
type category = {categoryId: string, name: string}
15+
16+
let getIncidentCategoryName = (
17+
incidents: Belt.Map.String.t<incident>,
18+
categories: Belt.Map.String.t<category>,
19+
~incidentId,
20+
) =>
21+
incidentId
22+
->Option.flatMap(incidentId => incidents->Belt.Map.String.get(incidentId))
23+
->Option.flatMap(incident => incident.categoryId)
24+
->Option.flatMap(categoryId => categories->Belt.Map.String.get(categoryId))
25+
->Option.map(category => category.name)
26+
}
27+
1028
module ForEach = {
1129
let testPrimitive = () => {
1230
let opt = Some(42)

0 commit comments

Comments
 (0)