Skip to content

compare and equal #84

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 12 commits into from
Jun 11, 2023
46 changes: 46 additions & 0 deletions src/Core__Array.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,50 @@ function fromInitializer(length, f) {
return arr;
}

function equal(a, b, eq) {
var len = a.length;
if (len === b.length) {
var _i = 0;
while(true) {
var i = _i;
if (i === len) {
return true;
}
if (!Curry._2(eq, a[i], b[i])) {
return false;
}
_i = i + 1 | 0;
continue ;
};
} else {
return false;
}
}

function compare(a, b, cmp) {
var lenA = a.length;
var lenB = b.length;
if (lenA > lenB) {
return 1;
} else if (lenA < lenB) {
return -1;
} else {
var _i = 0;
while(true) {
var i = _i;
if (i === lenA) {
return 0;
}
var c = Curry._2(cmp, a[i], b[i]);
if (c !== 0) {
return c;
}
_i = i + 1 | 0;
continue ;
};
}
}

function indexOfOpt(arr, item) {
var index = arr.indexOf(item);
if (index !== -1) {
Expand Down Expand Up @@ -126,6 +170,8 @@ function findMap(arr, f) {
export {
make ,
fromInitializer ,
equal ,
compare ,
indexOfOpt ,
lastIndexOfOpt ,
reduce ,
Expand Down
42 changes: 42 additions & 0 deletions src/Core__Array.res
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,48 @@ let fromInitializer = (~length, f) =>

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

let rec equalFromIndex = (a, b, i, eq, len) =>
if i === len {
true
} else if eq(a->getUnsafe(i), b->getUnsafe(i)) {
equalFromIndex(a, b, i + 1, eq, len)
} else {
false
}

let equal = (a, b, eq) => {
let len = a->length
if len === b->length {
equalFromIndex(a, b, 0, eq, len)
} else {
false
}
}

let rec compareFromIndex = (a, b, i, cmp, len) =>
if i === len {
0
} else {
let c = cmp(a->getUnsafe(i), b->getUnsafe(i))
if c === 0 {
compareFromIndex(a, b, i + 1, cmp, len)
} else {
c
}
}

let compare = (a, b, cmp) => {
let lenA = a->length
let lenB = b->length
if lenA > lenB {
1
} else if lenA < lenB {
-1
} else {
compareFromIndex(a, b, 0, cmp, lenA)
}
}

@send external copyAllWithin: (array<'a>, ~target: int) => array<'a> = "copyWithin"

@send
Expand Down
4 changes: 4 additions & 0 deletions src/Core__Array.resi
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,10 @@ let make: (~length: int, 'a) => array<'a>
*/
let fromInitializer: (~length: int, int => 'a) => array<'a>

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

let compare: (array<'a>, array<'a>, ('a, 'a) => int) => int

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

/**
Expand Down
11 changes: 11 additions & 0 deletions src/Core__Date.mjs
Original file line number Diff line number Diff line change
@@ -1,9 +1,20 @@
// Generated by ReScript, PLEASE EDIT WITH CARE

import * as Core__Float from "./Core__Float.mjs";

var UTC = {};

function equal(a, b) {
return a.getTime() === b.getTime();
}

function compare(a, b) {
return Core__Float.compare(a.getTime(), b.getTime());
}

export {
UTC ,
equal ,
compare ,
}
/* No side effect */
4 changes: 4 additions & 0 deletions src/Core__Date.res
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,10 @@ module UTC = {
@send external getTime: t => msSinceEpoch = "getTime"
@send external getTimezoneOffset: t => int = "getTimezoneOffset"

let equal = (a, b) => a->getTime === b->getTime

let compare = (a, b) => Core__Float.compare(a->getTime, b->getTime)

// Locale
@send external getFullYear: t => int = "getFullYear"
@send external getMonth: t => int = "getMonth"
Expand Down
4 changes: 4 additions & 0 deletions src/Core__Date.resi
Original file line number Diff line number Diff line change
Expand Up @@ -432,6 +432,10 @@ Returns the time, in milliseconds, between UNIX epoch (January 1, 1970 00:00:00
@val
external now: unit => msSinceEpoch = "Date.now"

let equal: (t, t) => bool

let compare: (t, t) => int

/**
`getTime(date)`

Expand Down
16 changes: 16 additions & 0 deletions src/Core__Float.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,20 @@

var Constants = {};

function equal(a, b) {
return a === b;
}

function compare(a, b) {
if (a < b) {
return -1;
} else if (a === b) {
return 0;
} else {
return 1;
}
}

function fromString(i) {
var i$1 = parseFloat(i);
if (isNaN(i$1)) {
Expand All @@ -14,6 +28,8 @@ function fromString(i) {

export {
Constants ,
equal ,
compare ,
fromString ,
}
/* No side effect */
11 changes: 11 additions & 0 deletions src/Core__Float.res
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,17 @@ module Constants = {
@val external maxValue: float = "Number.MAX_VALUE"
}

let equal = (a: float, b: float) => a === b

let compare = (a: float, b: float) =>
if a < b {
-1
} else if a === b {
0
} else {
1
}

@val external isNaN: float => bool = "isNaN"
@val external isFinite: float => bool = "isFinite"
@val external parseFloat: 'a => float = "parseFloat"
Expand Down
4 changes: 4 additions & 0 deletions src/Core__Float.resi
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ module Constants: {
external maxValue: float = "Number.MAX_VALUE"
}

let equal: (float, float) => bool

let compare: (float, float) => int

/**
`isNaN(v)` tests if the given `v` is `NaN`.
See [`NaN`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/NaN) on MDN.
Expand Down
16 changes: 16 additions & 0 deletions src/Core__Int.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,20 @@
import * as Pervasives from "rescript/lib/es6/pervasives.js";
import * as Core__Array from "./Core__Array.mjs";

function equal(a, b) {
return a === b;
}

function compare(a, b) {
if (a < b) {
return -1;
} else if (a === b) {
return 0;
} else {
return 1;
}
}

function fromString(radix, x) {
var maybeInt = radix !== undefined ? parseInt(x, radix) : parseInt(x);
if (isNaN(maybeInt) || maybeInt > 2147483647 || maybeInt < -2147483648) {
Expand Down Expand Up @@ -54,6 +68,8 @@ var Constants = {

export {
Constants ,
equal ,
compare ,
fromString ,
range ,
rangeWithOptions ,
Expand Down
11 changes: 11 additions & 0 deletions src/Core__Int.res
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,17 @@ module Constants = {
@inline let maxValue = 2147483647
}

let equal = (a: int, b: int) => a === b

let compare = (a: int, b: int) =>
if a < b {
-1
} else if a === b {
0
} else {
1
}

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

Expand Down
4 changes: 4 additions & 0 deletions src/Core__Int.resi
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,10 @@ module Constants: {
let maxValue: int
}

let equal: (int, int) => bool

let compare: (int, int) => int

/**
`toExponential(n)` return a `string` representing the given value in exponential
notation.
Expand Down
50 changes: 22 additions & 28 deletions src/Core__List.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -969,7 +969,7 @@ function every2(l1, l2, p) {
};
}

function cmpByLength(_l1, _l2) {
function compareLength(_l1, _l2) {
while(true) {
var l2 = _l2;
var l1 = _l1;
Expand All @@ -989,55 +989,49 @@ function cmpByLength(_l1, _l2) {
};
}

function cmp(l1, l2, f) {
var _l1 = l1;
var _l2 = l2;
var p = Curry.__2(f);
function compare(_l1, _l2, p) {
while(true) {
var l2$1 = _l2;
var l1$1 = _l1;
if (!l1$1) {
if (l2$1) {
var l2 = _l2;
var l1 = _l1;
if (!l1) {
if (l2) {
return -1;
} else {
return 0;
}
}
if (!l2$1) {
if (!l2) {
return 1;
}
var c = p(l1$1.hd, l2$1.hd);
var c = Curry._2(p, l1.hd, l2.hd);
if (c !== 0) {
return c;
}
_l2 = l2$1.tl;
_l1 = l1$1.tl;
_l2 = l2.tl;
_l1 = l1.tl;
continue ;
};
}

function eq(l1, l2, f) {
var _l1 = l1;
var _l2 = l2;
var p = Curry.__2(f);
function equal(_l1, _l2, p) {
while(true) {
var l2$1 = _l2;
var l1$1 = _l1;
if (!l1$1) {
if (l2$1) {
var l2 = _l2;
var l1 = _l1;
if (!l1) {
if (l2) {
return false;
} else {
return true;
}
}
if (!l2$1) {
if (!l2) {
return false;
}
if (!p(l1$1.hd, l2$1.hd)) {
if (!Curry._2(p, l1.hd, l2.hd)) {
return false;
}
_l2 = l2$1.tl;
_l1 = l1$1.tl;
_l2 = l2.tl;
_l1 = l1.tl;
continue ;
};
}
Expand Down Expand Up @@ -1386,9 +1380,9 @@ export {
some ,
every2 ,
some2 ,
cmpByLength ,
cmp ,
eq ,
compareLength ,
compare ,
equal ,
has ,
getBy ,
filter ,
Expand Down
Loading