Skip to content

Commit 28ea75e

Browse files
authored
Merge pull request rescript-lang#1669 from alcarvalho/optional-standard-funs
Add more functions and tests to Js.Option
2 parents 66020c7 + e321cfe commit 28ea75e

File tree

6 files changed

+448
-0
lines changed

6 files changed

+448
-0
lines changed

jscomp/others/js_option.ml

+22
Original file line numberDiff line numberDiff line change
@@ -59,5 +59,27 @@ let andThen f x =
5959
| None -> None
6060
| Some x -> f x [@bs]
6161

62+
let map f x =
63+
match x with
64+
| None -> None
65+
| Some x -> Some (f x [@bs])
6266

67+
let default a x =
68+
match x with
69+
| None -> a
70+
| Some x -> x
6371

72+
let filter f x =
73+
match x with
74+
| None -> None
75+
| Some x ->
76+
if f x [@bs] then
77+
Some x
78+
else
79+
None
80+
81+
let firstSome a b =
82+
match (a, b) with
83+
| (Some _, _) -> a
84+
| (None, Some _) -> b
85+
| (None, None) -> None

jscomp/others/js_option.mli

+8
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,11 @@ val getExn : 'a option -> 'a
3737
val equal : ('a -> 'b -> bool [@bs]) -> 'a option -> 'b option -> bool
3838

3939
val andThen : ('a -> 'b option [@bs]) -> 'a option -> 'b option
40+
41+
val map : ('a -> 'b [@bs]) -> 'a option -> 'b option
42+
43+
val default : 'a -> 'a option -> 'a
44+
45+
val filter : ('a -> bool [@bs]) -> 'a option -> 'a option
46+
47+
val firstSome : 'a option -> 'a option -> 'a option

jscomp/test/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,7 @@ OTHERS := literals a test_ari test_export2 test_internalOO test_obj_simple_ffi t
157157
mario_game\
158158
gpr_1600_test\
159159
js_list_test\
160+
js_option_test\
160161
gpr_1658_test\
161162
gpr_1667_test
162163

jscomp/test/js_option_test.js

+288
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,288 @@
1+
'use strict';
2+
3+
var Mt = require("./mt.js");
4+
var Block = require("../../lib/js/block.js");
5+
var Js_option = require("../../lib/js/js_option.js");
6+
7+
function simpleEq(a, b) {
8+
return +(a === b);
9+
}
10+
11+
var option_suites_000 = /* tuple */[
12+
"option_isSome_Some",
13+
function () {
14+
return /* Eq */Block.__(0, [
15+
/* true */1,
16+
/* true */1
17+
]);
18+
}
19+
];
20+
21+
var option_suites_001 = /* :: */[
22+
/* tuple */[
23+
"option_isSome_None",
24+
function () {
25+
return /* Eq */Block.__(0, [
26+
/* false */0,
27+
/* false */0
28+
]);
29+
}
30+
],
31+
/* :: */[
32+
/* tuple */[
33+
"option_isNone_Some",
34+
function () {
35+
return /* Eq */Block.__(0, [
36+
/* false */0,
37+
/* false */0
38+
]);
39+
}
40+
],
41+
/* :: */[
42+
/* tuple */[
43+
"option_isNone_None",
44+
function () {
45+
return /* Eq */Block.__(0, [
46+
/* true */1,
47+
/* true */1
48+
]);
49+
}
50+
],
51+
/* :: */[
52+
/* tuple */[
53+
"option_isSomeValue_Eq",
54+
function () {
55+
return /* Eq */Block.__(0, [
56+
/* true */1,
57+
Js_option.isSomeValue(simpleEq, 2, /* Some */[2])
58+
]);
59+
}
60+
],
61+
/* :: */[
62+
/* tuple */[
63+
"option_isSomeValue_Diff",
64+
function () {
65+
return /* Eq */Block.__(0, [
66+
/* false */0,
67+
Js_option.isSomeValue(simpleEq, 1, /* Some */[2])
68+
]);
69+
}
70+
],
71+
/* :: */[
72+
/* tuple */[
73+
"option_isSomeValue_DiffNone",
74+
function () {
75+
return /* Eq */Block.__(0, [
76+
/* false */0,
77+
Js_option.isSomeValue(simpleEq, 1, /* None */0)
78+
]);
79+
}
80+
],
81+
/* :: */[
82+
/* tuple */[
83+
"option_getExn_Some",
84+
function () {
85+
return /* Eq */Block.__(0, [
86+
2,
87+
Js_option.getExn(/* Some */[2])
88+
]);
89+
}
90+
],
91+
/* :: */[
92+
/* tuple */[
93+
"option_equal_Eq",
94+
function () {
95+
return /* Eq */Block.__(0, [
96+
/* true */1,
97+
Js_option.equal(simpleEq, /* Some */[2], /* Some */[2])
98+
]);
99+
}
100+
],
101+
/* :: */[
102+
/* tuple */[
103+
"option_equal_Diff",
104+
function () {
105+
return /* Eq */Block.__(0, [
106+
/* false */0,
107+
Js_option.equal(simpleEq, /* Some */[1], /* Some */[2])
108+
]);
109+
}
110+
],
111+
/* :: */[
112+
/* tuple */[
113+
"option_equal_DiffNone",
114+
function () {
115+
return /* Eq */Block.__(0, [
116+
/* false */0,
117+
Js_option.equal(simpleEq, /* Some */[1], /* None */0)
118+
]);
119+
}
120+
],
121+
/* :: */[
122+
/* tuple */[
123+
"option_andThen_SomeSome",
124+
function () {
125+
return /* Eq */Block.__(0, [
126+
/* true */1,
127+
Js_option.isSomeValue(simpleEq, 3, Js_option.andThen(function (a) {
128+
return /* Some */[a + 1 | 0];
129+
}, /* Some */[2]))
130+
]);
131+
}
132+
],
133+
/* :: */[
134+
/* tuple */[
135+
"option_andThen_SomeNone",
136+
function () {
137+
return /* Eq */Block.__(0, [
138+
/* false */0,
139+
Js_option.isSomeValue(simpleEq, 3, Js_option.andThen(function () {
140+
return /* None */0;
141+
}, /* Some */[2]))
142+
]);
143+
}
144+
],
145+
/* :: */[
146+
/* tuple */[
147+
"option_map_Some",
148+
function () {
149+
return /* Eq */Block.__(0, [
150+
/* true */1,
151+
Js_option.isSomeValue(simpleEq, 3, Js_option.map(function (a) {
152+
return a + 1 | 0;
153+
}, /* Some */[2]))
154+
]);
155+
}
156+
],
157+
/* :: */[
158+
/* tuple */[
159+
"option_map_None",
160+
function () {
161+
return /* Eq */Block.__(0, [
162+
/* None */0,
163+
Js_option.map(function (a) {
164+
return a + 1 | 0;
165+
}, /* None */0)
166+
]);
167+
}
168+
],
169+
/* :: */[
170+
/* tuple */[
171+
"option_default_Some",
172+
function () {
173+
return /* Eq */Block.__(0, [
174+
2,
175+
Js_option.$$default(3, /* Some */[2])
176+
]);
177+
}
178+
],
179+
/* :: */[
180+
/* tuple */[
181+
"option_default_None",
182+
function () {
183+
return /* Eq */Block.__(0, [
184+
3,
185+
Js_option.$$default(3, /* None */0)
186+
]);
187+
}
188+
],
189+
/* :: */[
190+
/* tuple */[
191+
"option_filter_Pass",
192+
function () {
193+
return /* Eq */Block.__(0, [
194+
/* true */1,
195+
Js_option.isSomeValue(simpleEq, 2, Js_option.filter(function (a) {
196+
return +(a % 2 === 0);
197+
}, /* Some */[2]))
198+
]);
199+
}
200+
],
201+
/* :: */[
202+
/* tuple */[
203+
"option_filter_Reject",
204+
function () {
205+
return /* Eq */Block.__(0, [
206+
/* None */0,
207+
Js_option.filter(function (a) {
208+
return +(a % 3 === 0);
209+
}, /* Some */[2])
210+
]);
211+
}
212+
],
213+
/* :: */[
214+
/* tuple */[
215+
"option_filter_None",
216+
function () {
217+
return /* Eq */Block.__(0, [
218+
/* None */0,
219+
Js_option.filter(function (a) {
220+
return +(a % 3 === 0);
221+
}, /* None */0)
222+
]);
223+
}
224+
],
225+
/* :: */[
226+
/* tuple */[
227+
"option_firstSome_First",
228+
function () {
229+
return /* Eq */Block.__(0, [
230+
/* true */1,
231+
Js_option.isSomeValue(simpleEq, 3, Js_option.firstSome(/* Some */[3], /* Some */[2]))
232+
]);
233+
}
234+
],
235+
/* :: */[
236+
/* tuple */[
237+
"option_firstSome_First",
238+
function () {
239+
return /* Eq */Block.__(0, [
240+
/* true */1,
241+
Js_option.isSomeValue(simpleEq, 2, Js_option.firstSome(/* None */0, /* Some */[2]))
242+
]);
243+
}
244+
],
245+
/* :: */[
246+
/* tuple */[
247+
"option_firstSome_None",
248+
function () {
249+
return /* Eq */Block.__(0, [
250+
/* None */0,
251+
Js_option.firstSome(/* None */0, /* None */0)
252+
]);
253+
}
254+
],
255+
/* [] */0
256+
]
257+
]
258+
]
259+
]
260+
]
261+
]
262+
]
263+
]
264+
]
265+
]
266+
]
267+
]
268+
]
269+
]
270+
]
271+
]
272+
]
273+
]
274+
]
275+
]
276+
]
277+
];
278+
279+
var option_suites = /* :: */[
280+
option_suites_000,
281+
option_suites_001
282+
];
283+
284+
Mt.from_pair_suites("js_option_test.ml", option_suites);
285+
286+
exports.simpleEq = simpleEq;
287+
exports.option_suites = option_suites;
288+
/* Not a pure module */

0 commit comments

Comments
 (0)