UNPKG

@rescript/std

Version:

The motiviation of this repo is that when ReScript users want to share their library with JS users, the JS users don't need have ReScript toolchain installed, this makes sharing code with JS users easier (more details on that topic can be found in our [Ex

607 lines (559 loc) 12.3 kB
import * as Caml from "./caml.js"; function mk(lo, hi) { return [ hi, (lo >>> 0) ]; } var min_int = [ -2147483648, 0 ]; var max_int = [ 2147483647, 4294967295 ]; var one = [ 0, 1 ]; var zero = [ 0, 0 ]; var neg_one = [ -1, 4294967295 ]; function neg_signed(x) { return (x & -2147483648) !== 0; } function non_neg_signed(x) { return (x & -2147483648) === 0; } function succ(param) { var x_lo = param[1]; var x_hi = param[0]; var lo = x_lo + 1 | 0; return [ x_hi + ( lo === 0 ? 1 : 0 ) | 0, (lo >>> 0) ]; } function neg(param) { var other_lo = (param[1] ^ -1) + 1 | 0; return [ (param[0] ^ -1) + ( other_lo === 0 ? 1 : 0 ) | 0, (other_lo >>> 0) ]; } function add_aux(param, y_lo, y_hi) { var x_lo = param[1]; var lo = x_lo + y_lo | 0; var overflow = neg_signed(x_lo) && (neg_signed(y_lo) || non_neg_signed(lo)) || neg_signed(y_lo) && non_neg_signed(lo) ? 1 : 0; return [ param[0] + y_hi + overflow | 0, (lo >>> 0) ]; } function add(self, param) { return add_aux(self, param[1], param[0]); } function equal(x, y) { if (x[1] === y[1]) { return x[0] === y[0]; } else { return false; } } function equal_null(x, y) { if (y !== null) { return Caml.i64_eq(x, y); } else { return false; } } function equal_undefined(x, y) { if (y !== undefined) { return Caml.i64_eq(x, y); } else { return false; } } function equal_nullable(x, y) { if (y == null) { return false; } else { return Caml.i64_eq(x, y); } } function sub_aux(x, lo, hi) { var y_lo = ((lo ^ -1) + 1 >>> 0); var y_hi = (hi ^ -1) + ( y_lo === 0 ? 1 : 0 ) | 0; return add_aux(x, y_lo, y_hi); } function sub(self, param) { return sub_aux(self, param[1], param[0]); } function lsl_(x, numBits) { if (numBits === 0) { return x; } var lo = x[1]; if (numBits >= 32) { return [ (lo << (numBits - 32 | 0)), 0 ]; } else { return [ (lo >>> (32 - numBits | 0)) | (x[0] << numBits), ((lo << numBits) >>> 0) ]; } } function lsr_(x, numBits) { if (numBits === 0) { return x; } var hi = x[0]; var offset = numBits - 32 | 0; if (offset === 0) { return [ 0, (hi >>> 0) ]; } else if (offset > 0) { return [ 0, (hi >>> offset) ]; } else { return [ (hi >>> numBits), (((hi << (-offset | 0)) | (x[1] >>> numBits)) >>> 0) ]; } } function asr_(x, numBits) { if (numBits === 0) { return x; } var hi = x[0]; if (numBits < 32) { return [ (hi >> numBits), (((hi << (32 - numBits | 0)) | (x[1] >>> numBits)) >>> 0) ]; } else { return [ hi >= 0 ? 0 : -1, ((hi >> (numBits - 32 | 0)) >>> 0) ]; } } function is_zero(x) { if (x[0] !== 0) { return false; } else { return x[1] === 0; } } function mul(_this, _other) { while(true) { var other = _other; var $$this = _this; var lo; var this_hi = $$this[0]; var exit = 0; var exit$1 = 0; var exit$2 = 0; if (this_hi !== 0) { exit$2 = 4; } else { if ($$this[1] === 0) { return zero; } exit$2 = 4; } if (exit$2 === 4) { if (other[0] !== 0) { exit$1 = 3; } else { if (other[1] === 0) { return zero; } exit$1 = 3; } } if (exit$1 === 3) { if (this_hi !== -2147483648 || $$this[1] !== 0) { exit = 2; } else { lo = other[1]; } } if (exit === 2) { var other_hi = other[0]; var lo$1 = $$this[1]; var exit$3 = 0; if (other_hi !== -2147483648 || other[1] !== 0) { exit$3 = 3; } else { lo = lo$1; } if (exit$3 === 3) { var other_lo = other[1]; if (this_hi < 0) { if (other_hi >= 0) { return neg(mul(neg($$this), other)); } _other = neg(other); _this = neg($$this); continue ; } if (other_hi < 0) { return neg(mul($$this, neg(other))); } var a48 = (this_hi >>> 16); var a32 = this_hi & 65535; var a16 = (lo$1 >>> 16); var a00 = lo$1 & 65535; var b48 = (other_hi >>> 16); var b32 = other_hi & 65535; var b16 = (other_lo >>> 16); var b00 = other_lo & 65535; var c48 = 0; var c32 = 0; var c16 = 0; var c00 = a00 * b00; c16 = (c00 >>> 16) + a16 * b00; c32 = (c16 >>> 16); c16 = (c16 & 65535) + a00 * b16; c32 = c32 + (c16 >>> 16) + a32 * b00; c48 = (c32 >>> 16); c32 = (c32 & 65535) + a16 * b16; c48 = c48 + (c32 >>> 16); c32 = (c32 & 65535) + a00 * b32; c48 = c48 + (c32 >>> 16); c32 = c32 & 65535; c48 = c48 + (a48 * b00 + a32 * b16 + a16 * b32 + a00 * b48) & 65535; return [ c32 | (c48 << 16), ((c00 & 65535 | ((c16 & 65535) << 16)) >>> 0) ]; } } if ((lo & 1) === 0) { return zero; } else { return min_int; } }; } function xor(param, param$1) { return [ param[0] ^ param$1[0], ((param[1] ^ param$1[1]) >>> 0) ]; } function or_(param, param$1) { return [ param[0] | param$1[0], ((param[1] | param$1[1]) >>> 0) ]; } function and_(param, param$1) { return [ param[0] & param$1[0], ((param[1] & param$1[1]) >>> 0) ]; } function to_float(param) { return param[0] * 0x100000000 + param[1]; } function of_float(x) { if (isNaN(x) || !isFinite(x)) { return zero; } if (x <= -9.22337203685477581e+18) { return min_int; } if (x + 1 >= 9.22337203685477581e+18) { return max_int; } if (x < 0) { return neg(of_float(- x)); } var hi = x / 4294967296 | 0; var lo = x % 4294967296 | 0; return [ hi, (lo >>> 0) ]; } function isSafeInteger(param) { var hi = param[0]; var top11Bits = (hi >> 21); if (top11Bits === 0) { return true; } else if (top11Bits === -1) { return !(param[1] === 0 && hi === -2097152); } else { return false; } } function to_string(self) { if (isSafeInteger(self)) { return String(to_float(self)); } if (self[0] < 0) { if (Caml.i64_eq(self, min_int)) { return "-9223372036854775808"; } else { return "-" + to_string(neg(self)); } } var approx_div1 = of_float(Math.floor(to_float(self) / 10)); var lo = approx_div1[1]; var hi = approx_div1[0]; var match = sub_aux(sub_aux(self, (lo << 3), (lo >>> 29) | (hi << 3)), (lo << 1), (lo >>> 31) | (hi << 1)); var rem_lo = match[1]; var rem_hi = match[0]; if (rem_lo === 0 && rem_hi === 0) { return to_string(approx_div1) + "0"; } if (rem_hi < 0) { var rem_lo$1 = ((rem_lo ^ -1) + 1 >>> 0); var delta = Math.ceil(rem_lo$1 / 10); var remainder = 10 * delta - rem_lo$1; return to_string(sub_aux(approx_div1, delta | 0, 0)) + String(remainder | 0); } var delta$1 = Math.floor(rem_lo / 10); var remainder$1 = rem_lo - 10 * delta$1; return to_string(add_aux(approx_div1, delta$1 | 0, 0)) + String(remainder$1 | 0); } function div(_self, _other) { while(true) { var other = _other; var self = _self; var self_hi = self[0]; var exit = 0; var exit$1 = 0; if (other[0] !== 0 || other[1] !== 0) { exit$1 = 2; } else { throw { RE_EXN_ID: "Division_by_zero", Error: new Error() }; } if (exit$1 === 2) { if (self_hi !== -2147483648) { if (self_hi !== 0) { exit = 1; } else { if (self[1] === 0) { return zero; } exit = 1; } } else if (self[1] !== 0) { exit = 1; } else { if (Caml.i64_eq(other, one) || Caml.i64_eq(other, neg_one)) { return self; } if (Caml.i64_eq(other, min_int)) { return one; } var half_this = asr_(self, 1); var approx = lsl_(div(half_this, other), 1); var exit$2 = 0; if (approx[0] !== 0) { exit$2 = 3; } else { if (approx[1] === 0) { if (other[0] < 0) { return one; } else { return neg(one); } } exit$2 = 3; } if (exit$2 === 3) { var rem = sub(self, mul(other, approx)); return add(approx, div(rem, other)); } } } if (exit === 1) { var other_hi = other[0]; var exit$3 = 0; if (other_hi !== -2147483648) { exit$3 = 2; } else { if (other[1] === 0) { return zero; } exit$3 = 2; } if (exit$3 === 2) { if (self_hi < 0) { if (other_hi >= 0) { return neg(div(neg(self), other)); } _other = neg(other); _self = neg(self); continue ; } if (other_hi < 0) { return neg(div(self, neg(other))); } var res = zero; var rem$1 = self; while(Caml.i64_ge(rem$1, other)) { var b = Math.floor(to_float(rem$1) / to_float(other)); var approx$1 = 1 > b ? 1 : b; var log2 = Math.ceil(Math.log(approx$1) / Math.LN2); var delta = log2 <= 48 ? 1 : Math.pow(2, log2 - 48); var approxRes = of_float(approx$1); var approxRem = mul(approxRes, other); while(approxRem[0] < 0 || Caml.i64_gt(approxRem, rem$1)) { approx$1 = approx$1 - delta; approxRes = of_float(approx$1); approxRem = mul(approxRes, other); }; if (is_zero(approxRes)) { approxRes = one; } res = add(res, approxRes); rem$1 = sub(rem$1, approxRem); }; return res; } } }; } function mod_(self, other) { return sub(self, mul(div(self, other), other)); } function div_mod(self, other) { var quotient = div(self, other); return [ quotient, sub(self, mul(quotient, other)) ]; } function compare(self, other) { var y = other[0]; var x = self[0]; var v = x < y ? -1 : ( x === y ? 0 : 1 ); if (v !== 0) { return v; } var y$1 = other[1]; var x$1 = self[1]; if (x$1 < y$1) { return -1; } else if (x$1 === y$1) { return 0; } else { return 1; } } function of_int32(lo) { return [ lo < 0 ? -1 : 0, (lo >>> 0) ]; } function to_int32(x) { return x[1] | 0; } function to_hex(x) { var x_lo = x[1]; var x_hi = x[0]; var aux = function (v) { return (v >>> 0).toString(16); }; if (x_hi === 0 && x_lo === 0) { return "0"; } if (x_lo === 0) { return aux(x_hi) + "00000000"; } if (x_hi === 0) { return aux(x_lo); } var lo = aux(x_lo); var pad = 8 - lo.length | 0; if (pad <= 0) { return aux(x_hi) + lo; } else { return aux(x_hi) + ("0".repeat(pad) + lo); } } function discard_sign(x) { return [ 2147483647 & x[0], x[1] ]; } function float_of_bits(x) { return (function(lo,hi){ return (new Float64Array(new Int32Array([lo,hi]).buffer))[0]})(x[1], x[0]); } function bits_of_float(x) { var match = (function(x){return new Int32Array(new Float64Array([x]).buffer)})(x); return [ match[1], (match[0] >>> 0) ]; } export { mk , succ , min_int , max_int , one , zero , neg_one , of_int32 , to_int32 , add , neg , sub , lsl_ , lsr_ , asr_ , is_zero , mul , xor , or_ , and_ , equal , equal_null , equal_undefined , equal_nullable , to_float , of_float , div , mod_ , compare , float_of_bits , bits_of_float , div_mod , to_hex , discard_sign , to_string , } /* No side effect */