Idris2/support/js/support.js
2023-01-08 12:50:26 +00:00

218 lines
5.3 KiB
JavaScript

class IdrisError extends Error { }
function __prim_js2idris_array(x){
let acc = { h:0 };
for (let i = x.length-1; i>=0; i--) {
acc = { a1:x[i], a2:acc };
}
return acc;
}
function __prim_idris2js_array(x){
const result = Array();
while (x.h === undefined) {
result.push(x.a1); x = x.a2;
}
return result;
}
function __lazy(thunk) {
let res;
return function () {
if (thunk === undefined) return res;
res = thunk();
thunk = undefined;
return res;
};
};
function __prim_stringIteratorNew(_str) {
return 0
}
function __prim_stringIteratorToString(_, str, it, f) {
return f(str.slice(it))
}
function __prim_stringIteratorNext(str, it) {
if (it >= str.length)
return {h: 0};
else
return {a1: str.charAt(it), a2: it + 1};
}
function __tailRec(f,ini) {
let obj = ini;
while(true){
switch(obj.h){
case 0: return obj.a1;
default: obj = f(obj);
}
}
}
const _idrisworld = Symbol('idrisworld')
const _crashExp = x=>{throw new IdrisError(x)}
const _bigIntOfString = s=> {
try {
const idx = s.indexOf('.')
return idx === -1 ? BigInt(s) : BigInt(s.slice(0, idx))
} catch (e) { return 0n }
}
const _numberOfString = s=> {
try {
const res = Number(s);
return isNaN(res) ? 0 : res;
} catch (e) { return 0 }
}
const _intOfString = s=> Math.trunc(_numberOfString(s))
const _truncToChar = x=> String.fromCodePoint(
(x >= 0 && x <= 55295) || (x >= 57344 && x <= 1114111) ? x : 0
)
// Int8
const _truncInt8 = x => {
const res = x & 0xff;
return res >= 0x80 ? res - 0x100 : res;
}
const _truncBigInt8 = x => Number(BigInt.asIntN(8, x))
// Euclidian Division
const _div = (a,b) => {
const q = Math.trunc(a / b)
const r = a % b
return r < 0 ? (b > 0 ? q - 1 : q + 1) : q
}
const _divBigInt = (a,b) => {
const q = a / b
const r = a % b
return r < 0n ? (b > 0n ? q - 1n : q + 1n) : q
}
// Euclidian Modulo
const _mod = (a,b) => {
const r = a % b
return r < 0 ? (b > 0 ? r + b : r - b) : r
}
const _modBigInt = (a,b) => {
const r = a % b
return r < 0n ? (b > 0n ? r + b : r - b) : r
}
const _add8s = (a,b) => _truncInt8(a + b)
const _sub8s = (a,b) => _truncInt8(a - b)
const _mul8s = (a,b) => _truncInt8(a * b)
const _div8s = (a,b) => _truncInt8(_div(a,b))
const _shl8s = (a,b) => _truncInt8(a << b)
const _shr8s = (a,b) => _truncInt8(a >> b)
// Int16
const _truncInt16 = x => {
const res = x & 0xffff;
return res >= 0x8000 ? res - 0x10000 : res;
}
const _truncBigInt16 = x => Number(BigInt.asIntN(16, x))
const _add16s = (a,b) => _truncInt16(a + b)
const _sub16s = (a,b) => _truncInt16(a - b)
const _mul16s = (a,b) => _truncInt16(a * b)
const _div16s = (a,b) => _truncInt16(_div(a,b))
const _shl16s = (a,b) => _truncInt16(a << b)
const _shr16s = (a,b) => _truncInt16(a >> b)
//Int32
const _truncInt32 = x => x & 0xffffffff
const _truncBigInt32 = x => Number(BigInt.asIntN(32, x))
const _add32s = (a,b) => _truncInt32(a + b)
const _sub32s = (a,b) => _truncInt32(a - b)
const _div32s = (a,b) => _truncInt32(_div(a,b))
const _mul32s = (a,b) => {
const res = a * b;
if (res <= Number.MIN_SAFE_INTEGER || res >= Number.MAX_SAFE_INTEGER) {
return _truncInt32((a & 0xffff) * b + (b & 0xffff) * (a & 0xffff0000))
} else {
return _truncInt32(res)
}
}
//Int64
const _truncBigInt64 = x => BigInt.asIntN(64, x)
const _add64s = (a,b) => _truncBigInt64(a + b)
const _sub64s = (a,b) => _truncBigInt64(a - b)
const _mul64s = (a,b) => _truncBigInt64(a * b)
const _shl64s = (a,b) => _truncBigInt64(a << b)
const _div64s = (a,b) => _truncBigInt64(_divBigInt(a,b))
const _shr64s = (a,b) => _truncBigInt64(a >> b)
//Bits8
const _truncUInt8 = x => x & 0xff
const _truncUBigInt8 = x => Number(BigInt.asUintN(8, x))
const _add8u = (a,b) => (a + b) & 0xff
const _sub8u = (a,b) => (a - b) & 0xff
const _mul8u = (a,b) => (a * b) & 0xff
const _div8u = (a,b) => Math.trunc(a / b)
const _shl8u = (a,b) => (a << b) & 0xff
const _shr8u = (a,b) => (a >> b) & 0xff
//Bits16
const _truncUInt16 = x => x & 0xffff
const _truncUBigInt16 = x => Number(BigInt.asUintN(16, x))
const _add16u = (a,b) => (a + b) & 0xffff
const _sub16u = (a,b) => (a - b) & 0xffff
const _mul16u = (a,b) => (a * b) & 0xffff
const _div16u = (a,b) => Math.trunc(a / b)
const _shl16u = (a,b) => (a << b) & 0xffff
const _shr16u = (a,b) => (a >> b) & 0xffff
//Bits32
const _truncUBigInt32 = x => Number(BigInt.asUintN(32, x))
const _truncUInt32 = x => {
const res = x & -1;
return res < 0 ? res + 0x100000000 : res;
}
const _add32u = (a,b) => _truncUInt32(a + b)
const _sub32u = (a,b) => _truncUInt32(a - b)
const _mul32u = (a,b) => _truncUInt32(_mul32s(a,b))
const _div32u = (a,b) => Math.trunc(a / b)
const _shl32u = (a,b) => _truncUInt32(a << b)
const _shr32u = (a,b) => _truncUInt32(a <= 0x7fffffff ? a >> b : (b == 0 ? a : (a >> b) ^ ((-0x80000000) >> (b-1))))
const _and32u = (a,b) => _truncUInt32(a & b)
const _or32u = (a,b) => _truncUInt32(a | b)
const _xor32u = (a,b) => _truncUInt32(a ^ b)
//Bits64
const _truncUBigInt64 = x => BigInt.asUintN(64, x)
const _add64u = (a,b) => BigInt.asUintN(64, a + b)
const _mul64u = (a,b) => BigInt.asUintN(64, a * b)
const _div64u = (a,b) => a / b
const _shl64u = (a,b) => BigInt.asUintN(64, a << b)
const _shr64u = (a,b) => BigInt.asUintN(64, a >> b)
const _sub64u = (a,b) => BigInt.asUintN(64, a - b)
//String
const _strReverse = x => x.split('').reverse().join('')
const _substr = (o,l,x) => x.slice(o, o + l)