Skip to content
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.

Commit c3df5aa

Browse files
committedMar 3, 2023
Add Array.equal, Array.compare
1 parent a2e33af commit c3df5aa

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed
 

‎src/Core__Array.mjs

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

27+
function equal(a, b, eq) {
28+
var eq$1 = Curry.__2(eq);
29+
var len = a.length;
30+
if (len === b.length) {
31+
var _i = 0;
32+
while(true) {
33+
var i = _i;
34+
if (i === len) {
35+
return true;
36+
}
37+
if (!eq$1(a[i], b[i])) {
38+
return false;
39+
}
40+
_i = i + 1 | 0;
41+
continue ;
42+
};
43+
} else {
44+
return false;
45+
}
46+
}
47+
48+
function compare(a, b, cmp) {
49+
var cmp$1 = Curry.__2(cmp);
50+
var lenA = a.length;
51+
var lenB = b.length;
52+
if (lenA > lenB) {
53+
return 1;
54+
} else if (lenA < lenB) {
55+
return -1;
56+
} else {
57+
var _i = 0;
58+
while(true) {
59+
var i = _i;
60+
if (i === lenA) {
61+
return 0;
62+
}
63+
var c = cmp$1(a[i], b[i]);
64+
if (c !== 0) {
65+
return c;
66+
}
67+
_i = i + 1 | 0;
68+
continue ;
69+
};
70+
}
71+
}
72+
2773
function indexOfOpt(arr, item) {
2874
var index = arr.indexOf(item);
2975
if (index !== -1) {
@@ -141,6 +187,8 @@ function findMap(arr, f) {
141187
export {
142188
make ,
143189
fromInitializer ,
190+
equal ,
191+
compare ,
144192
sort ,
145193
indexOfOpt ,
146194
lastIndexOfOpt ,

‎src/Core__Array.res

+46
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,52 @@ let fromInitializer = (~length, f) =>
4343

4444
@get external length: array<'a> => int = "length"
4545

46+
let rec equalFromIndexU = (a, b, i, eq, len) =>
47+
if i === len {
48+
true
49+
} else if eq(. a->getUnsafe(i), b->getUnsafe(i)) {
50+
equalFromIndexU(a, b, i + 1, eq, len)
51+
} else {
52+
false
53+
}
54+
55+
let equalU = (a, b, eq) => {
56+
let len = a->length
57+
if len === b->length {
58+
equalFromIndexU(a, b, 0, eq, len)
59+
} else {
60+
false
61+
}
62+
}
63+
64+
let equal = (a, b, eq) => equalU(a, b, (. a, b) => eq(a, b))
65+
66+
let rec compareFromIndexU = (a, b, i, cmp, len) =>
67+
if i === len {
68+
0
69+
} else {
70+
let c = cmp(. a->getUnsafe(i), b->getUnsafe(i))
71+
if c === 0 {
72+
compareFromIndexU(a, b, i + 1, cmp, len)
73+
} else {
74+
c
75+
}
76+
}
77+
78+
let compareU = (a, b, cmp) => {
79+
let lenA = a->length
80+
let lenB = b->length
81+
if lenA > lenB {
82+
1
83+
} else if lenA < lenB {
84+
-1
85+
} else {
86+
compareFromIndexU(a, b, 0, cmp, lenA)
87+
}
88+
}
89+
90+
let compare = (a, b, cmp) => compareU(a, b, (. a, b) => cmp(a, b))
91+
4692
@send external copyAllWithin: (array<'a>, ~target: int) => array<'a> = "copyWithin"
4793

4894
@send

‎src/Core__Array.resi

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

31+
let equal: (array<'a>, array<'a>, ('a, 'a) => bool) => bool
32+
33+
let compare: (array<'a>, array<'a>, ('a, 'a) => int) => int
34+
3135
@val external isArray: 'a => bool = "Array.isArray"
3236
@get external length: array<'a> => int = "length"
3337
@send external copyAllWithin: (array<'a>, ~target: int) => array<'a> = "copyWithin"

0 commit comments

Comments
 (0)
Please sign in to comment.