Skip to content

Commit 89cf5b0

Browse files
glennslzth
authored andcommitted
refactor: use Ordering for compare and sort functions
1 parent 17f0d29 commit 89cf5b0

25 files changed

+81
-94
lines changed

src/Core__Array.mjs

+7-6
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
import * as Curry from "rescript/lib/es6/curry.js";
44
import * as Js_math from "rescript/lib/es6/js_math.js";
55
import * as Caml_option from "rescript/lib/es6/caml_option.js";
6+
import * as Core__Ordering from "./Core__Ordering.mjs";
67

78
function make(length, x) {
89
if (length <= 0) {
@@ -47,19 +48,19 @@ function equal(a, b, eq) {
4748
function compare(a, b, cmp) {
4849
var lenA = a.length;
4950
var lenB = b.length;
50-
if (lenA > lenB) {
51-
return 1;
52-
} else if (lenA < lenB) {
53-
return -1;
51+
if (lenA < lenB) {
52+
return Core__Ordering.less;
53+
} else if (lenA > lenB) {
54+
return Core__Ordering.greater;
5455
} else {
5556
var _i = 0;
5657
while(true) {
5758
var i = _i;
5859
if (i === lenA) {
59-
return 0;
60+
return Core__Ordering.equal;
6061
}
6162
var c = Curry._2(cmp, a[i], b[i]);
62-
if (c !== 0) {
63+
if (!Core__Ordering.isEqual(c)) {
6364
return c;
6465
}
6566
_i = i + 1 | 0;

src/Core__Array.res

+9-11
Original file line numberDiff line numberDiff line change
@@ -57,10 +57,10 @@ let equal = (a, b, eq) => {
5757

5858
let rec compareFromIndex = (a, b, i, cmp, len) =>
5959
if i === len {
60-
0.
60+
Core__Ordering.equal
6161
} else {
6262
let c = cmp(a->getUnsafe(i), b->getUnsafe(i))
63-
if c === 0. {
63+
if c->Core__Ordering.isEqual {
6464
compareFromIndex(a, b, i + 1, cmp, len)
6565
} else {
6666
c
@@ -70,13 +70,11 @@ let rec compareFromIndex = (a, b, i, cmp, len) =>
7070
let compare = (a, b, cmp) => {
7171
let lenA = a->length
7272
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-
}
73+
lenA < lenB
74+
? Core__Ordering.less
75+
: lenA > lenB
76+
? Core__Ordering.greater
77+
: compareFromIndex(a, b, 0, cmp, lenA)
8078
}
8179

8280
@send external copyAllWithin: (array<'a>, ~target: int) => array<'a> = "copyWithin"
@@ -139,8 +137,8 @@ let lastIndexOfOpt = (arr, item) =>
139137
@send external sliceToEnd: (array<'a>, ~start: int) => array<'a> = "slice"
140138
@send external copy: array<'a> => array<'a> = "slice"
141139

142-
@send external sort: (array<'a>, ('a, 'a) => float) => unit = "sort"
143-
@send external toSorted: (array<'a>, ('a, 'a) => float) => array<'a> = "toSorted"
140+
@send external sort: (array<'a>, ('a, 'a) => Core__Ordering.t) => unit = "sort"
141+
@send external toSorted: (array<'a>, ('a, 'a) => Core__Ordering.t) => array<'a> = "toSorted"
144142

145143
@send external toString: array<'a> => string = "toString"
146144
@send external toLocaleString: array<'a> => string = "toLocaleString"

src/Core__Array.resi

+4-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ let fromInitializer: (~length: int, int => 'a) => array<'a>
2929

3030
let equal: (array<'a>, array<'a>, ('a, 'a) => bool) => bool
3131

32-
let compare: (array<'a>, array<'a>, ('a, 'a) => float) => float
32+
let compare: (array<'a>, array<'a>, ('a, 'a) => Core__Ordering.t) => Core__Ordering.t
3333

3434
@val external isArray: 'a => bool = "Array.isArray"
3535

@@ -212,14 +212,14 @@ See [`Array.toSorted`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/R
212212
## Examples
213213
```rescript
214214
let someArray = [3, 2, 1]
215-
let sorted = someArray->Array.toSorted((a, b) => float(a - b))
215+
let sorted = someArray->Array.toSorted(Int.compare)
216216

217217
Console.log(sorted) // [1, 2, 3]
218218
Console.log(someArray) // [3, 2, 1]. Original unchanged
219219
```
220220
*/
221221
@send
222-
external toSorted: (array<'a>, ('a, 'a) => float) => array<'a> = "toSorted"
222+
external toSorted: (array<'a>, ('a, 'a) => Core__Ordering.t) => array<'a> = "toSorted"
223223

224224
/**
225225
`sort(array, comparator)` sorts `array` in-place using the `comparator` function.
@@ -237,7 +237,7 @@ Console.log(someArray) // [1, 2, 3]
237237
```
238238
*/
239239
@send
240-
external sort: (array<'a>, ('a, 'a) => float) => unit = "sort"
240+
external sort: (array<'a>, ('a, 'a) => Core__Ordering.t) => unit = "sort"
241241

242242
@variadic @send
243243
external splice: (array<'a>, ~start: int, ~remove: int, ~insert: array<'a>) => unit = "splice"

src/Core__Date.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -434,7 +434,7 @@ external now: unit => msSinceEpoch = "Date.now"
434434

435435
let equal: (t, t) => bool
436436

437-
let compare: (t, t) => float
437+
let compare: (t, t) => Core__Ordering.t
438438

439439
/**
440440
`getTime(date)`

src/Core__Float.mjs

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

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

45
var Constants = {};
56

@@ -9,11 +10,11 @@ function equal(a, b) {
910

1011
function compare(a, b) {
1112
if (a < b) {
12-
return -1;
13-
} else if (a === b) {
14-
return 0;
13+
return Core__Ordering.less;
14+
} else if (a > b) {
15+
return Core__Ordering.greater;
1516
} else {
16-
return 1;
17+
return Core__Ordering.equal;
1718
}
1819
}
1920

src/Core__Float.res

+1-7
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,7 @@ module Constants = {
1010
let equal = (a: float, b: float) => a === b
1111

1212
let compare = (a: float, b: float) =>
13-
if a < b {
14-
-1.
15-
} else if a === b {
16-
0.
17-
} else {
18-
1.
19-
}
13+
a < b ? Core__Ordering.less : a > b ? Core__Ordering.greater : Core__Ordering.equal
2014

2115
@val external isNaN: float => bool = "isNaN"
2216
@val external isFinite: float => bool = "isFinite"

src/Core__Float.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ module Constants: {
111111

112112
let equal: (float, float) => bool
113113

114-
let compare: (float, float) => float
114+
let compare: (float, float) => Core__Ordering.t
115115

116116
/**
117117
`isNaN(v)` tests if the given `v` is `NaN`.

src/Core__Int.mjs

+5-4
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,19 @@
22

33
import * as Pervasives from "rescript/lib/es6/pervasives.js";
44
import * as Core__Array from "./Core__Array.mjs";
5+
import * as Core__Ordering from "./Core__Ordering.mjs";
56

67
function equal(a, b) {
78
return a === b;
89
}
910

1011
function compare(a, b) {
1112
if (a < b) {
12-
return -1;
13-
} else if (a === b) {
14-
return 0;
13+
return Core__Ordering.less;
14+
} else if (a > b) {
15+
return Core__Ordering.greater;
1516
} else {
16-
return 1;
17+
return Core__Ordering.equal;
1718
}
1819
}
1920

src/Core__Int.res

+1-7
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,7 @@ module Constants = {
66
let equal = (a: int, b: int) => a === b
77

88
let compare = (a: int, b: int) =>
9-
if a < b {
10-
-1.
11-
} else if a === b {
12-
0.
13-
} else {
14-
1.
15-
}
9+
a < b ? Core__Ordering.less : a > b ? Core__Ordering.greater : Core__Ordering.equal
1610

1711
@send external toExponential: int => string = "toExponential"
1812
@send external toExponentialWithPrecision: (int, ~digits: int) => string = "toExponential"

src/Core__Int.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ module Constants: {
5858

5959
let equal: (int, int) => bool
6060

61-
let compare: (int, int) => float
61+
let compare: (int, int) => Core__Ordering.t
6262

6363
/**
6464
`toExponential(n)` return a `string` representing the given value in exponential

src/Core__List.mjs

+8-7
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as Curry from "rescript/lib/es6/curry.js";
44
import * as Belt_Array from "rescript/lib/es6/belt_Array.js";
55
import * as Caml_option from "rescript/lib/es6/caml_option.js";
66
import * as Core__Array from "./Core__Array.mjs";
7+
import * as Core__Ordering from "./Core__Ordering.mjs";
78

89
function head(x) {
910
if (x) {
@@ -975,13 +976,13 @@ function compareLength(_l1, _l2) {
975976
var l1 = _l1;
976977
if (!l1) {
977978
if (l2) {
978-
return -1;
979+
return Core__Ordering.less;
979980
} else {
980-
return 0;
981+
return Core__Ordering.equal;
981982
}
982983
}
983984
if (!l2) {
984-
return 1;
985+
return Core__Ordering.greater;
985986
}
986987
_l2 = l2.tl;
987988
_l1 = l1.tl;
@@ -995,16 +996,16 @@ function compare(_l1, _l2, p) {
995996
var l1 = _l1;
996997
if (!l1) {
997998
if (l2) {
998-
return -1;
999+
return Core__Ordering.less;
9991000
} else {
1000-
return 0;
1001+
return Core__Ordering.equal;
10011002
}
10021003
}
10031004
if (!l2) {
1004-
return 1;
1005+
return Core__Ordering.greater;
10051006
}
10061007
var c = Curry._2(p, l1.hd, l2.hd);
1007-
if (c !== 0) {
1008+
if (!Core__Ordering.isEqual(c)) {
10081009
return c;
10091010
}
10101011
_l2 = l2.tl;

src/Core__List.res

+7-7
Original file line numberDiff line numberDiff line change
@@ -682,20 +682,20 @@ let every2 = (l1, l2, p) => every2U(l1, l2, (. a, b) => p(a, b))
682682

683683
let rec compareLength = (l1, l2) =>
684684
switch (l1, l2) {
685-
| (list{}, list{}) => 0.
686-
| (_, list{}) => 1.
687-
| (list{}, _) => -1.
685+
| (list{}, list{}) => Core__Ordering.equal
686+
| (_, list{}) => Core__Ordering.greater
687+
| (list{}, _) => Core__Ordering.less
688688
| (list{_, ...l1s}, list{_, ...l2s}) => compareLength(l1s, l2s)
689689
}
690690

691691
let rec compare = (l1, l2, p) =>
692692
switch (l1, l2) {
693-
| (list{}, list{}) => 0.
694-
| (_, list{}) => 1.
695-
| (list{}, _) => -1.
693+
| (list{}, list{}) => Core__Ordering.equal
694+
| (_, list{}) => Core__Ordering.greater
695+
| (list{}, _) => Core__Ordering.less
696696
| (list{a1, ...l1}, list{a2, ...l2}) =>
697697
let c = p(a1, a2)
698-
if c == 0. {
698+
if c->Core__Ordering.isEqual {
699699
compare(l1, l2, p)
700700
} else {
701701
c

src/Core__List.resi

+4-4
Original file line numberDiff line numberDiff line change
@@ -629,7 +629,7 @@ List.compareLength(list{1, 2, 3}, list{4, 5, 6}) // 0.
629629
List.compareLength(list{1, 2, 3, 4}, list{5, 6}) // 1.
630630
```
631631
*/
632-
let compareLength: (t<'a>, t<'a>) => float
632+
let compareLength: (t<'a>, t<'a>) => Core__Ordering.t
633633

634634
/**
635635
`compare(list1, list2, f)` compare elements one by one `f`. `f` returns a negative
@@ -660,7 +660,7 @@ List.compare(list{1, 3, 5}, list{1, 3, 5}, (a, b) => compare(a, b)) /* 0. */
660660
for Array, we compare the length first and, only if the lengths are equal, elements one by one.
661661
For lists, we just compare elements one by one.
662662
*/
663-
let compare: (t<'a>, t<'a>, ('a, 'a) => float) => float
663+
let compare: (t<'a>, t<'a>, ('a, 'a) => Core__Ordering.t) => Core__Ordering.t
664664

665665
/**
666666
`equal(list1, list2, f)` check equality of `list2` and `list2` using `f` for
@@ -874,7 +874,7 @@ let setAssoc: (t<('a, 'c)>, 'a, 'c, ('a, 'a) => bool) => t<('a, 'c)>
874874
## Examples
875875

876876
```rescript
877-
List.sort(list{5, 4, 9, 3, 7}, (a, b) => float(a - b)) // list{3, 4, 5, 7, 9}
877+
List.sort(list{5, 4, 9, 3, 7}, Int.compare) // list{3, 4, 5, 7, 9}
878878
```
879879
*/
880-
let sort: (t<'a>, ('a, 'a) => float) => t<'a>
880+
let sort: (t<'a>, ('a, 'a) => Core__Ordering.t) => t<'a>

src/Core__Null.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ external make: 'a => t<'a> = "%identity"
4646

4747
let equal: (t<'a>, t<'b>, ('a, 'b) => bool) => bool
4848

49-
let compare: (t<'a>, t<'b>, ('a, 'b) => float) => float
49+
let compare: (t<'a>, t<'b>, ('a, 'b) => Core__Ordering.t) => Core__Ordering.t
5050

5151
/**
5252
Converts a nullable value into an option, so it can be pattern matched on.

src/Core__Nullable.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ external make: 'a => t<'a> = "%identity"
5757

5858
let equal: (t<'a>, t<'b>, ('a, 'b) => bool) => bool
5959

60-
let compare: (t<'a>, t<'b>, ('a, 'b) => float) => float
60+
let compare: (t<'a>, t<'b>, ('a, 'b) => Core__Ordering.t) => Core__Ordering.t
6161

6262
/**
6363
Converts a nullable value into an option, so it can be pattern matched on.

src/Core__Option.mjs

+4-3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import * as Curry from "rescript/lib/es6/curry.js";
44
import * as Caml_option from "rescript/lib/es6/caml_option.js";
5+
import * as Core__Ordering from "./Core__Ordering.mjs";
56

67
function filter(opt, p) {
78
var p$1 = Curry.__1(p);
@@ -95,12 +96,12 @@ function compare(a, b, cmp) {
9596
if (b !== undefined) {
9697
return Curry._2(cmp, Caml_option.valFromOption(a), Caml_option.valFromOption(b));
9798
} else {
98-
return 1;
99+
return Core__Ordering.greater;
99100
}
100101
} else if (b !== undefined) {
101-
return -1;
102+
return Core__Ordering.less;
102103
} else {
103-
return 0;
104+
return Core__Ordering.equal;
104105
}
105106
}
106107

src/Core__Option.res

+3-3
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ let equal = (a, b, eq) =>
100100
let compare = (a, b, cmp) =>
101101
switch (a, b) {
102102
| (Some(a), Some(b)) => cmp(a, b)
103-
| (None, Some(_)) => -1.
104-
| (Some(_), None) => 1.
105-
| (None, None) => 0.
103+
| (None, Some(_)) => Core__Ordering.less
104+
| (Some(_), None) => Core__Ordering.greater
105+
| (None, None) => Core__Ordering.equal
106106
}

src/Core__Option.resi

+1-1
Original file line numberDiff line numberDiff line change
@@ -247,4 +247,4 @@ compare(Some(14), None, clockCompare) // 1.
247247
compare(None, None, clockCompare) // 0.
248248
```
249249
*/
250-
let compare: (option<'a>, option<'b>, ('a, 'b) => float) => float
250+
let compare: (option<'a>, option<'b>, ('a, 'b) => Core__Ordering.t) => Core__Ordering.t

0 commit comments

Comments
 (0)