Current section

Files

Jump to
bigi src bigi_ffi.mjs
Raw

src/bigi_ffi.mjs

import { Ok, Error, toList } from "./gleam.mjs";
import { Lt, Eq, Gt } from "../gleam_stdlib/gleam/order.mjs";
import { DecodeError } from "../gleam_stdlib/gleam/dynamic.mjs";
export function from(int) {
return BigInt(int);
}
export function from_string(string) {
try {
return new Ok(BigInt(string));
} catch {
return new Error(undefined);
}
}
export function to(bigint) {
if (bigint > Number.MAX_SAFE_INTEGER || bigint < Number.MIN_SAFE_INTEGER) {
return new Error(undefined);
} else {
return new Ok(Number(bigint));
}
}
export function to_string(bigint) {
return bigint.toString();
}
export function zero() {
return 0n;
}
export function compare(a, b) {
if (a < b) {
return new Gt();
} else if (a > b) {
return new Lt();
} else {
return new Eq();
}
}
export function absolute(bigint) {
if (bigint < 0) {
return -bigint;
} else {
return bigint;
}
}
export function add(a, b) {
return a + b;
}
export function subtract(a, b) {
return a - b;
}
export function multiply(a, b) {
return a * b;
}
export function divide(a, b) {
if (b === 0n) {
return 0n;
}
return a / b;
}
export function divide_no_zero(a, b) {
if (b === 0n) {
return new Error(undefined);
}
return new Ok(divide(a, b));
}
export function remainder(a, b) {
if (b === 0n) {
return 0n;
}
return a % b;
}
export function remainder_no_zero(a, b) {
if (b === 0n) {
return new Error(undefined);
}
return new Ok(remainder(a, b));
}
export function modulo(a, b) {
if (b === 0n) {
return 0n;
}
return ((a % b) + b) % b;
}
export function modulo_no_zero(a, b) {
if (b === 0n) {
return new Error(undefined);
}
return new Ok(modulo(a, b));
}
export function power(a, b) {
if (b < 0) {
return new Error(undefined);
}
return new Ok(a ** b);
}
export function decode(dyn) {
const dynType = typeof dyn;
if (dynType === "bigint") {
return new Ok(dyn);
} else {
return new Error(toList([new DecodeError("bigint", dynType, toList([]))]));
}
}