Skip to content

Commit 92c42ac

Browse files
committed
Add Array.equal, Array.compare
1 parent f35ba39 commit 92c42ac

File tree

3 files changed

+98
-0
lines changed

3 files changed

+98
-0
lines changed

src/Core__Array.mjs

Lines changed: 48 additions & 0 deletions
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) {
@@ -126,6 +172,8 @@ function findMap(arr, f) {
126172
export {
127173
make ,
128174
fromInitializer ,
175+
equal ,
176+
compare ,
129177
indexOfOpt ,
130178
lastIndexOfOpt ,
131179
reduce ,

src/Core__Array.res

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,52 @@ let fromInitializer = (~length, f) =>
3737

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

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

4288
@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
/**

0 commit comments

Comments
 (0)