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

Lines changed: 46 additions & 0 deletions
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

Lines changed: 42 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 11 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 16 additions & 0 deletions
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

Lines changed: 11 additions & 0 deletions
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

Lines changed: 4 additions & 0 deletions
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

Lines changed: 16 additions & 0 deletions
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 ,

0 commit comments

Comments
 (0)