Skip to content

Commit 3a45914

Browse files
authored
compare and equal (#84)
* eq -> equal, cmp -> compare * Fix typo * Add String.equal, String.compare * Add Int.equal, Int.compare * Add Float.equal, Float.compare * Add Date.equal, Date.compare * Add Array.equal, Array.compare * Simplify Option.equal, Option.compare * Add Null.equal, Null.compare * Add Nullable.equal, Nullable.compare * Handle Infinity, NaN correctly for Int compare * Remove xxxU functions
1 parent 7d498f7 commit 3a45914

30 files changed

+341
-123
lines changed

src/Core__Array.mjs

+46
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,50 @@ function fromInitializer(length, f) {
2424
return arr;
2525
}
2626

27+
function equal(a, b, eq) {
28+
var len = a.length;
29+
if (len === b.length) {
30+
var _i = 0;
31+
while(true) {
32+
var i = _i;
33+
if (i === len) {
34+
return true;
35+
}
36+
if (!Curry._2(eq, a[i], b[i])) {
37+
return false;
38+
}
39+
_i = i + 1 | 0;
40+
continue ;
41+
};
42+
} else {
43+
return false;
44+
}
45+
}
46+
47+
function compare(a, b, cmp) {
48+
var lenA = a.length;
49+
var lenB = b.length;
50+
if (lenA > lenB) {
51+
return 1;
52+
} else if (lenA < lenB) {
53+
return -1;
54+
} else {
55+
var _i = 0;
56+
while(true) {
57+
var i = _i;
58+
if (i === lenA) {
59+
return 0;
60+
}
61+
var c = Curry._2(cmp, a[i], b[i]);
62+
if (c !== 0) {
63+
return c;
64+
}
65+
_i = i + 1 | 0;
66+
continue ;
67+
};
68+
}
69+
}
70+
2771
function indexOfOpt(arr, item) {
2872
var index = arr.indexOf(item);
2973
if (index !== -1) {
@@ -126,6 +170,8 @@ function findMap(arr, f) {
126170
export {
127171
make ,
128172
fromInitializer ,
173+
equal ,
174+
compare ,
129175
indexOfOpt ,
130176
lastIndexOfOpt ,
131177
reduce ,

src/Core__Array.res

+42
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,48 @@ let fromInitializer = (~length, f) =>
3737

3838
@get external length: array<'a> => int = "length"
3939

40+
let rec equalFromIndex = (a, b, i, eq, len) =>
41+
if i === len {
42+
true
43+
} else if eq(a->getUnsafe(i), b->getUnsafe(i)) {
44+
equalFromIndex(a, b, i + 1, eq, len)
45+
} else {
46+
false
47+
}
48+
49+
let equal = (a, b, eq) => {
50+
let len = a->length
51+
if len === b->length {
52+
equalFromIndex(a, b, 0, eq, len)
53+
} else {
54+
false
55+
}
56+
}
57+
58+
let rec compareFromIndex = (a, b, i, cmp, len) =>
59+
if i === len {
60+
0
61+
} else {
62+
let c = cmp(a->getUnsafe(i), b->getUnsafe(i))
63+
if c === 0 {
64+
compareFromIndex(a, b, i + 1, cmp, len)
65+
} else {
66+
c
67+
}
68+
}
69+
70+
let compare = (a, b, cmp) => {
71+
let lenA = a->length
72+
let lenB = b->length
73+
if lenA > lenB {
74+
1
75+
} else if lenA < lenB {
76+
-1
77+
} else {
78+
compareFromIndex(a, b, 0, cmp, lenA)
79+
}
80+
}
81+
4082
@send external copyAllWithin: (array<'a>, ~target: int) => array<'a> = "copyWithin"
4183

4284
@send

src/Core__Array.resi

+4
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ let make: (~length: int, 'a) => array<'a>
2727
*/
2828
let fromInitializer: (~length: int, int => 'a) => array<'a>
2929

30+
let equal: (array<'a>, array<'a>, ('a, 'a) => bool) => bool
31+
32+
let compare: (array<'a>, array<'a>, ('a, 'a) => int) => int
33+
3034
@val external isArray: 'a => bool = "Array.isArray"
3135

3236
/**

src/Core__Date.mjs

+11
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,20 @@
11
// Generated by ReScript, PLEASE EDIT WITH CARE
22

3+
import * as Core__Float from "./Core__Float.mjs";
34

45
var UTC = {};
56

7+
function equal(a, b) {
8+
return a.getTime() === b.getTime();
9+
}
10+
11+
function compare(a, b) {
12+
return Core__Float.compare(a.getTime(), b.getTime());
13+
}
14+
615
export {
716
UTC ,
17+
equal ,
18+
compare ,
819
}
920
/* No side effect */

src/Core__Date.res

+4
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,10 @@ module UTC = {
8686
@send external getTime: t => msSinceEpoch = "getTime"
8787
@send external getTimezoneOffset: t => int = "getTimezoneOffset"
8888

89+
let equal = (a, b) => a->getTime === b->getTime
90+
91+
let compare = (a, b) => Core__Float.compare(a->getTime, b->getTime)
92+
8993
// Locale
9094
@send external getFullYear: t => int = "getFullYear"
9195
@send external getMonth: t => int = "getMonth"

src/Core__Date.resi

+4
Original file line numberDiff line numberDiff line change
@@ -432,6 +432,10 @@ Returns the time, in milliseconds, between UNIX epoch (January 1, 1970 00:00:00
432432
@val
433433
external now: unit => msSinceEpoch = "Date.now"
434434

435+
let equal: (t, t) => bool
436+
437+
let compare: (t, t) => int
438+
435439
/**
436440
`getTime(date)`
437441

src/Core__Float.mjs

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33

44
var Constants = {};
55

6+
function equal(a, b) {
7+
return a === b;
8+
}
9+
10+
function compare(a, b) {
11+
if (a < b) {
12+
return -1;
13+
} else if (a === b) {
14+
return 0;
15+
} else {
16+
return 1;
17+
}
18+
}
19+
620
function fromString(i) {
721
var i$1 = parseFloat(i);
822
if (isNaN(i$1)) {
@@ -14,6 +28,8 @@ function fromString(i) {
1428

1529
export {
1630
Constants ,
31+
equal ,
32+
compare ,
1733
fromString ,
1834
}
1935
/* No side effect */

src/Core__Float.res

+11
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,17 @@ module Constants = {
77
@val external maxValue: float = "Number.MAX_VALUE"
88
}
99

10+
let equal = (a: float, b: float) => a === b
11+
12+
let compare = (a: float, b: float) =>
13+
if a < b {
14+
-1
15+
} else if a === b {
16+
0
17+
} else {
18+
1
19+
}
20+
1021
@val external isNaN: float => bool = "isNaN"
1122
@val external isFinite: float => bool = "isFinite"
1223
@val external parseFloat: 'a => float = "parseFloat"

src/Core__Float.resi

+4
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,10 @@ module Constants: {
109109
external maxValue: float = "Number.MAX_VALUE"
110110
}
111111

112+
let equal: (float, float) => bool
113+
114+
let compare: (float, float) => int
115+
112116
/**
113117
`isNaN(v)` tests if the given `v` is `NaN`.
114118
See [`NaN`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) on MDN.

src/Core__Int.mjs

+16
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,20 @@
33
import * as Pervasives from "rescript/lib/es6/pervasives.js";
44
import * as Core__Array from "./Core__Array.mjs";
55

6+
function equal(a, b) {
7+
return a === b;
8+
}
9+
10+
function compare(a, b) {
11+
if (a < b) {
12+
return -1;
13+
} else if (a === b) {
14+
return 0;
15+
} else {
16+
return 1;
17+
}
18+
}
19+
620
function fromString(radix, x) {
721
var maybeInt = radix !== undefined ? parseInt(x, radix) : parseInt(x);
822
if (isNaN(maybeInt) || maybeInt > 2147483647 || maybeInt < -2147483648) {
@@ -54,6 +68,8 @@ var Constants = {
5468

5569
export {
5670
Constants ,
71+
equal ,
72+
compare ,
5773
fromString ,
5874
range ,
5975
rangeWithOptions ,

src/Core__Int.res

+11
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,17 @@ module Constants = {
33
@inline let maxValue = 2147483647
44
}
55

6+
let equal = (a: int, b: int) => a === b
7+
8+
let compare = (a: int, b: int) =>
9+
if a < b {
10+
-1
11+
} else if a === b {
12+
0
13+
} else {
14+
1
15+
}
16+
617
@send external toExponential: int => string = "toExponential"
718
@send external toExponentialWithPrecision: (int, ~digits: int) => string = "toExponential"
819

src/Core__Int.resi

+4
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ module Constants: {
5656
let maxValue: int
5757
}
5858

59+
let equal: (int, int) => bool
60+
61+
let compare: (int, int) => int
62+
5963
/**
6064
`toExponential(n)` return a `string` representing the given value in exponential
6165
notation.

src/Core__List.mjs

+22-28
Original file line numberDiff line numberDiff line change
@@ -969,7 +969,7 @@ function every2(l1, l2, p) {
969969
};
970970
}
971971

972-
function cmpByLength(_l1, _l2) {
972+
function compareLength(_l1, _l2) {
973973
while(true) {
974974
var l2 = _l2;
975975
var l1 = _l1;
@@ -989,55 +989,49 @@ function cmpByLength(_l1, _l2) {
989989
};
990990
}
991991

992-
function cmp(l1, l2, f) {
993-
var _l1 = l1;
994-
var _l2 = l2;
995-
var p = Curry.__2(f);
992+
function compare(_l1, _l2, p) {
996993
while(true) {
997-
var l2$1 = _l2;
998-
var l1$1 = _l1;
999-
if (!l1$1) {
1000-
if (l2$1) {
994+
var l2 = _l2;
995+
var l1 = _l1;
996+
if (!l1) {
997+
if (l2) {
1001998
return -1;
1002999
} else {
10031000
return 0;
10041001
}
10051002
}
1006-
if (!l2$1) {
1003+
if (!l2) {
10071004
return 1;
10081005
}
1009-
var c = p(l1$1.hd, l2$1.hd);
1006+
var c = Curry._2(p, l1.hd, l2.hd);
10101007
if (c !== 0) {
10111008
return c;
10121009
}
1013-
_l2 = l2$1.tl;
1014-
_l1 = l1$1.tl;
1010+
_l2 = l2.tl;
1011+
_l1 = l1.tl;
10151012
continue ;
10161013
};
10171014
}
10181015

1019-
function eq(l1, l2, f) {
1020-
var _l1 = l1;
1021-
var _l2 = l2;
1022-
var p = Curry.__2(f);
1016+
function equal(_l1, _l2, p) {
10231017
while(true) {
1024-
var l2$1 = _l2;
1025-
var l1$1 = _l1;
1026-
if (!l1$1) {
1027-
if (l2$1) {
1018+
var l2 = _l2;
1019+
var l1 = _l1;
1020+
if (!l1) {
1021+
if (l2) {
10281022
return false;
10291023
} else {
10301024
return true;
10311025
}
10321026
}
1033-
if (!l2$1) {
1027+
if (!l2) {
10341028
return false;
10351029
}
1036-
if (!p(l1$1.hd, l2$1.hd)) {
1030+
if (!Curry._2(p, l1.hd, l2.hd)) {
10371031
return false;
10381032
}
1039-
_l2 = l2$1.tl;
1040-
_l1 = l1$1.tl;
1033+
_l2 = l2.tl;
1034+
_l1 = l1.tl;
10411035
continue ;
10421036
};
10431037
}
@@ -1386,9 +1380,9 @@ export {
13861380
some ,
13871381
every2 ,
13881382
some2 ,
1389-
cmpByLength ,
1390-
cmp ,
1391-
eq ,
1383+
compareLength ,
1384+
compare ,
1385+
equal ,
13921386
has ,
13931387
getBy ,
13941388
filter ,

0 commit comments

Comments
 (0)