export function clear(value: T): T export function clear(value: Record): Record { for (const entry of Object.entries(value)) { if (entry[1] == undefined) delete value[entry[0]] else if (typeof entry[1] == "object") value[entry[0]] = clear(entry[1]) } return value } export function round(value: number, precision: number): number { const factor = Math.pow(10, Math.floor(precision)) const decimals = (value.toString().split(".")?.[1]?.length ?? 0) - 1 return Math.round((value + (decimals <= Math.floor(precision) + 5 ? 0 : Math.pow(10, -decimals))) * factor) / factor } export function add(precision: number, value1: number, value2: number): number { return round(round(value1, precision) + round(value2, precision), precision) } export function divide(precision: number, amount: number, denominator: number): number { return round(round(amount, precision) / denominator, precision) } export function multiply(precision: number, amount: number, multiplicand: number): number { return round(round(amount, precision) * multiplicand, precision) } export function subtract(precision: number, minuend: number, subtrahend: number): number { return round(round(minuend, precision) - round(subtrahend, precision), precision) } export function isDefined(value: T | undefined): value is T { return value != undefined } export function recreate(value: T): T { return Array.isArray(value) ? [...value.map(v => recreate(v))] : typeof value == "object" && value != null ? Object.entries(value).reduce((r: any, e: any[]) => ({ ...r, [e[0]]: recreate(e[1]) }), {}) : value }