{"version":3,"sources":["quantity.ts"],"sourcesContent":["import { Unit, UnitCodeBySymbol, UnitCodeBySymbolShortForms, UnitPrefixCodeBySymbol, UnitSymbolShortFormsByCode, unit_factor, unit, unit_symbol, UnitSymbol, code_to_extended_symbol, UnitAliases, DerivedUnits, unit_base_symbol } from \"../compiler/unit_codes.ts\";\nimport { RuntimeError, SyntaxError, ValueError } from \"./errors.ts\";\n\n\n/**\n * \n * let x:Unit.METRE = new Unit(11, \"cm\");\n * let x:Unit.EUR   = new Unit(10000, \"€\");\n * \n */\n\n// deno-lint-ignore no-namespace\nexport namespace Quantity {\n\n    export type SECOND  = Quantity<Unit.SECOND>\n    export type METRE   = Quantity<Unit.METRE>\n    export type GRAM    = Quantity<Unit.GRAM>\n    export type AMPERE  = Quantity<Unit.AMPERE>\n    export type KELVIN  = Quantity<Unit.KELVIN>\n    export type MOLE    = Quantity<Unit.MOLE>\n    export type CANDELA = Quantity<Unit.CANDELA>\n\n    export type CMO     = Quantity<Unit.CMO>\n\n    export type EUR     = Quantity<Unit.EUR>\n    export type USD     = Quantity<Unit.USD>\n    export type GBP     = Quantity<Unit.GBP>\n    export type RUB     = Quantity<Unit.RUB>\n    export type JPY     = Quantity<Unit.JPY>\n    export type CNY     = Quantity<Unit.CNY>\n\n}\n\n\ntype expanded_symbol = [factor_num:number|bigint, factor_den:number|bigint, unit:Unit, exponent?:number][];\n\n\n\n\n// Quantity with unit\nexport class Quantity<U extends Unit = Unit> {\n\n    static cached_binaries = new Map<string, ArrayBuffer>();\n\n    static known_aliases = [\n        [\"g*m^2/A/s^3\", \"V\", 1000n],\n        [\"g*m^2/s^2\", \"J\", 1000n],\n        [\"g*m/s^2\", \"N\", 1000n],\n        [\"g*m^2/s^3\", \"W\", 1000n],\n        [\"A^2*s^4/g/m^2\", \"F\", 1000n],\n        [\"g*m^2/A^2/s^3\", \"Ω\", 1000n],\n        [\"s^-1\", \"Hz\"],\n        [\"A*s\", \"C\"],\n        [\"A^2*s^4/g/m\", \"F/m\", 1n, 1000n],\n\n        [\"g\", \"kg\", 1000n],\n\n    ] as const\n\n\n    static readonly EXPONENT_MIN = -128\n    static readonly EXPONENT_MAX = 127\n\n    #numerator!: bigint\n    #denominator!: bigint\n\n    get numerator():bigint {return this.#numerator}\n    get denominator():bigint {return this.#denominator}\n\n    get is_finite_decimal():boolean {return this.#hasFiniteDecimalRep(this.#denominator)}\n\n\n    get sign():-1|0|1 {\n        if (this.#numerator === 0n) return 0;\n        return this.#numerator>0 ? 1 : -1; \n    }\n\n    set value(value:number|bigint|string) {\n        this.setFraction(...this.convertToFraction(value))\n    }\n\n    get value():number {\n        return Number(this.#numerator)/Number(this.#denominator)\n    }\n\n    // returns quantity with value 1 and same unit\n    #base_value?:Quantity<U>;\n    get base_value():Quantity<U> {\n        if (this.#base_value) return this.#base_value;\n        else return this.#base_value = new Quantity(1, this.unit);\n    }\n\n    readonly unit: unit = []\n    unit_binary!: ArrayBuffer\n    unit_formatted!: string\n    unit_formatted_short!: string\n    short_divisor!: bigint\n    short_multiplier!: bigint\n\n    get unit_factor_number() {return this.unit.length}\n\n    /**\n     * \n     * @param value can be a number, bigint, or string: '1.25', '1', '0.5e12', '1/10', or [numerator, denominator]\n     * @param unit \n     */\n    constructor(value?:number|bigint|string|[num:number|bigint, den:number|bigint], unit?:code_to_extended_symbol<U>)\n    constructor(value?:number|bigint|string|[num:number|bigint, den:number|bigint], encoded_unit?:unit)\n    constructor(value:number|bigint|string|[num:number|bigint, den:number|bigint] = 1, symbol_or_encoded_unit:string|unit = 'x') {\n\n        // set value:\n        if (typeof value == \"number\" || typeof value == \"bigint\" || typeof value == \"string\") this.value = value;\n        else if (value instanceof Array) this.setFraction(value[0], value[1]);\n\n        // set unit:\n        // encoded array\n        if (symbol_or_encoded_unit instanceof Array) this.unit = symbol_or_encoded_unit;\n        // symbol string, parse\n        else if (symbol_or_encoded_unit) {\n            const [factor_num, factor_den, unit] = this.parseUnit(symbol_or_encoded_unit);\n            this.unit = unit;\n            this.multiply(factor_num);\n            this.divide(factor_den);\n        }\n\n        this.setFormattedUnit();\n        this.setUnitBinary();\n    }\n\n\n    // fraction/value handling ----------------------------------------------------------------------------------------------\n\n    \n    // numerator and denominator must be integer values!\n    setFraction(numerator:number|bigint, denominator:number|bigint) {\n        [this.#numerator, this.#denominator] = Quantity.#normalizeFraction(numerator, denominator)\n    }\n\n    static #normalizeFraction(numerator:number|bigint, denominator:number|bigint):[numerator:bigint, denominator:bigint] {\n        // denominator always positive, numerator has sign\n        if (numerator<0 && denominator <0) {\n            numerator = -numerator;\n            denominator = -denominator;\n        }\n        else if (numerator>=0 && denominator <0) {\n            numerator = -numerator;\n            denominator = -denominator;\n        }\n\n        numerator = BigInt(numerator)\n        denominator = BigInt(denominator)\n\n\n        // reduce to lowest terms\n        const gcd = this.#gcd(numerator, denominator)\n\n        if (gcd > 1n) {\n            numerator /= gcd;\n            denominator /= gcd;\n        }\n        else if (gcd < -1n) {\n            numerator /= -gcd;\n            denominator /= -gcd;\n        }\n        \n        return [numerator, denominator];\n    }\n\n    // convert float or integer to (decimal) fraction\n    convertToFraction(number:number|bigint|string):[numerator:bigint, denominator:bigint] {\n\n        if (typeof number == \"number\" && (!Number.isFinite(number) || Number.isNaN(number))) throw new ValueError(\"Quantity value must be a finite number\");\n\n        try {\n            let factor = 1n;\n            let divisor = 1n;\n    \n            // remove underscores and spaces\n            if (typeof number == \"string\") number = number.replace(/\\ |\\_/g, \"\");\n    \n            // fraction\n            if (typeof number == \"string\" && number.includes(\"/\")) {\n                const [n, d] = number.split(\"/\");\n                return [BigInt(n), BigInt(d)]\n            }\n    \n            // e\n            if (typeof number == \"string\" && (number.includes(\"e\") || number.includes(\"E\"))) {\n                const [n, e] = number.split(/e|E/);\n                number = n;\n                // negative exponent\n                if (e[0] == '-') divisor = 10n ** BigInt(e.slice(1))\n                // positive exponent\n                else if (e[0] == '+') factor = 10n ** BigInt(e.slice(1))\n                else factor = 10n ** BigInt(e)\n            }\n    \n    \n            // convert number to decimal fraction\n            const value_parts = number.toString().split(\".\");\n            const numerator = BigInt(value_parts.join(\"\"));\n            const denominator = value_parts[1] ? 10n**BigInt(value_parts[1].length) : 1n; // comma shift\n    \n            return [factor*numerator, divisor*denominator]\n        }\n\n        catch {\n            throw new SyntaxError(\"Invalid quantity value '\"+number+\"'\")\n        }\n        \n    }   \n\n\n    // greates common divisor (Euclidian algorithm)\n    static #gcd (n1:bigint, n2:bigint):bigint {\n        while (n2 !== 0n) {\n            const t = n2;\n            n2 = n1 % n2;\n            n1 = t;\n        }\n        return n1;\n    }\n    \n\n    // least common multiple\n    static #lcm (n1:bigint, n2:bigint):bigint {\n        return (n1 * n2) / this.#gcd(n1, n2);\n    }\n    \n\n    static #isPowerOf10(n:bigint) {\n        while(n > 1n && n % 10n == 0n){\n            n /= 10n;\n        }\n        return n === 1n;\n    }\n\n    // prime factorization - complexity O(sqrt(n)) - probably more efficient\n    // checks if only prime factors 2 and 5 are present\n    #hasFiniteDecimalRep(denominator:bigint) {\n        while (denominator % 2n == 0n) {\n            denominator /= 2n;\n        }\n        for (let i = 3n; i * i <= denominator; i += 2n) {\n            while (denominator % i == 0n) {\n                denominator /= i;\n                if (i != 2n && i != 5n) {\n                    return false // not allowed\n                }\n            }\n        }\n        if (denominator > 2) { // for primes larger than 2\n            if (denominator != 2n && denominator != 5n) {\n                return false // not allowed\n            }\n        }\n\n        return true;\n    }\n\n    #raiseUnitToPower(unit:unit, power:bigint|number) {\n        power = Number(power);\n        const new_exp = [];\n        for (const u of unit) new_exp.push([u[0], u[1] * power]);\n        return new_exp;\n    }\n\n    // returns buffer for absolute bigint value\n    static bigIntToBuffer(n:bigint):Uint8Array {\n        let hex = BigInt(n).toString(16).replace('-', '');\n        if (hex.length % 2) { hex = '0' + hex; }\n      \n        const len = hex.length / 2;\n        const u8 = new Uint8Array(len);\n      \n        let i = 0;\n        let j = 0;\n        while (i < len) {\n          u8[i] = parseInt(hex.slice(j, j+2), 16);\n          i += 1;\n          j += 2;\n        }\n      \n        return u8;\n    }\n\n    static bufferToBigInt(buffer:Uint8Array) {\n        const hex:string[] = [];\n      \n        buffer.forEach(function (i) {\n          let h = i.toString(16);\n          if (h.length % 2) { h = '0' + h; }\n          hex.push(h);\n        });\n      \n        return BigInt('0x' + hex.join(''));\n    }\n\n    // unit handling ---------------------------------------------------------------------------------------------------------\n\n\n    // TODO: type guard currently not working properly in TS (https://github.com/microsoft/TypeScript/issues/13995)\n    hasBaseUnit<SYMBOL extends unit_base_symbol>(unit: Extract<SYMBOL, U extends Unit ? code_to_extended_symbol<U> : unknown>) { //: this is Quantity<symbol_to_code[SYMBOL]> {\n        return this.unit_formatted_short === unit;\n    }\n\n\n\n    setUnitBinary() {\n        const buffer = new ArrayBuffer(1+this.unit.length*2);\n        const uint8 = new Uint8Array(buffer);\n        const dataview = new DataView(buffer);\n\n        // factor number\n        uint8[0] = this.unit.length;\n\n        let i = 1;\n        // [unit_code] [exponent (-127 to 128)]\n        for (const [code, exponent] of this.unit) {\n            uint8[i++] = code;\n            dataview.setInt8(i++, exponent)\n        }\n\n    \n        // get cached\n        if (Quantity.cached_binaries.has(this.unit_formatted)) this.unit_binary = <ArrayBuffer> Quantity.cached_binaries.get(this.unit_formatted)\n        // save in cache\n        else {\n            this.unit_binary = buffer;\n            Quantity.cached_binaries.set(this.unit_formatted, buffer)\n        }\n    }\n\n    // parse unit and return updated value with factor\n    parseUnit(unit?:string):[factor_num:bigint, factor_den:bigint, unit:unit] {\n\n        // dimensionless\n        if (!unit) return [1n, 1n, []];\n\n        const encoded:unit = [];\n\n        // combined factor k,M,G, ... prefixes\n        let combined_factor_num = 1n; \n        let combined_factor_den = 1n; \n\n        const parts = unit.replace(/(\\*|\\/)/g, '#$1').split('#');\n\n        for (let part of parts) {\n            let exp = 1;\n            // negative exponent\n            if (part.startsWith(\"/\")) {\n                part = part.slice(1);\n                exp = -1;\n            }\n            // positive exponent\n            if (part.startsWith(\"*\")) {\n                part = part.slice(1);\n            }\n\n            const [symbol, exponent_string] = <[unit_symbol, string]>part.split(\"^\");\n\n            // ^ exponent\n            if (exponent_string) exp *= parseInt(exponent_string);\n\n            // exponent in valid range?\n            if (exp < Quantity.EXPONENT_MIN) throw new SyntaxError(\"Minimum unit exponent is \" + Quantity.EXPONENT_MIN)\n            if (exp > Quantity.EXPONENT_MAX) throw new SyntaxError(\"Maximum unit exponent is \" + Quantity.EXPONENT_MAX)\n\n            // get expanded components from the symbol\n            const expanded_symbol = this.getExpandedSymbolWithPrefix(symbol);\n\n            for (const [factor_num, factor_den, unit, _exp] of expanded_symbol) {\n                const exponent = (_exp??1) * exp; // multiply implicit exponent from expansion with exponent from unit string\n\n                if (Math.sign(exponent) == 1) {\n                    combined_factor_num *= BigInt(factor_num) // factor numerator\n                    combined_factor_den *= BigInt(factor_den) // factor denominator\n                }\n                else {\n                    combined_factor_num *= BigInt(factor_den) // inverse factor numerator\n                    combined_factor_den *= BigInt(factor_num) // inverse factor denominator\n                }\n\n                // combine with existing\n                this.#addUnitAndExponent(encoded, unit, exponent)\n            }\n            \n        }\n\n        this.#sortEncodedUnit(encoded)\n\n        return [combined_factor_num, combined_factor_den, encoded];\n    }\n\n    \n\n    // get binary code and factor from string symbol with prefix\n    getExpandedSymbolWithPrefix(prefixed_symbol:string): expanded_symbol {\n        const expanded_symbol = this.getExpandedSymbol(<unit_symbol>prefixed_symbol);\n        // no prefix\n        if (expanded_symbol != null) return expanded_symbol;\n\n        // prefix\n        else {\n            const prefix_exp = UnitPrefixCodeBySymbol[prefixed_symbol[0]];\n            // no valid prefix found\n            if (prefix_exp == null) throw new SyntaxError(\"Invalid unit symbol '\" + prefixed_symbol + \"'\")\n           \n            const expanded_symbol = this.getExpandedSymbol(<unit_symbol>prefixed_symbol.slice(1));\n            // no valid symbol found\n            if (expanded_symbol == null) throw new SyntaxError(\"Invalid unit symbol '\" + prefixed_symbol + \"'\");\n\n            // add prefix factor to first unit\n            expanded_symbol.push([\n                prefix_exp > 0 ? (10n ** BigInt(prefix_exp)) : 1, \n                prefix_exp < 0 ? (10n ** BigInt(-prefix_exp)) : 1, \n                Unit.DIMENSIONLESS\n            ])\n\n            return expanded_symbol;\n        }\n    }\n\n    // get binary code from string symbol\n    getExpandedSymbol(symbol:unit_symbol): expanded_symbol|undefined {\n        if (symbol in UnitCodeBySymbol) return [[1, 1, UnitCodeBySymbol[symbol]]];\n        else if (symbol in UnitCodeBySymbolShortForms) return [[1, 1, UnitCodeBySymbolShortForms[symbol]]];\n        else if (symbol in UnitAliases) return [UnitAliases[symbol]];\n        else if (symbol in DerivedUnits) return [...DerivedUnits[symbol]];\n    }\n\n    getCodeSymbol(symbol:Unit|unit_factor, abs_exponent = false) {\n        const exponent = abs_exponent ? Math.abs(symbol[1]) : symbol[1];\n        if (symbol instanceof Array) return `${this.getCodeSymbol(symbol[0])}${exponent==1 ? '' : '^'+exponent}`\n        else return UnitSymbolShortFormsByCode[symbol] ?? UnitSymbol[symbol];\n    }\n\n    setFormattedUnit(){\n        let formatted = \"\";\n        let is_first = true;\n        let format_divisor = 1n;\n        let format_multiplier = 1n;\n\n        for (const encoded of this.unit) {\n            if (is_first) formatted += encoded[1] < 0 ? 'x/' : ''\n            else formatted += encoded[1] < 0 ? '/' : '*'\n            formatted += this.getCodeSymbol(encoded, true);\n\n            is_first = false;\n        }\n\n        this.unit_formatted = formatted || UnitSymbol[Unit.DIMENSIONLESS];\n\n        // replace with shortcut aliases\n        for (const [expression, alias, divisor, multiplicator] of Quantity.known_aliases) {\n            if (formatted.startsWith(expression)) {\n                formatted = formatted.replace(expression, alias);\n                if (divisor) format_divisor *= divisor??1;\n                if (multiplicator) format_multiplier *= multiplicator??1\n            }\n        }\n        \n        this.unit_formatted_short = formatted || UnitSymbol[Unit.DIMENSIONLESS];\n        this.short_divisor = format_divisor;\n        this.short_multiplier = format_multiplier;\n    }\n\n\n    equals(other:Quantity) {\n        return this.hasSameDimension(other) && this.denominator === other.denominator && this.numerator === other.numerator\n    }\n\n    // operations\n\n    product<F extends number|bigint|Quantity>(factor:F): F extends Quantity ? Quantity : Quantity<U> {\n        if (factor instanceof Quantity) return new Quantity([this.numerator*factor.numerator,this.denominator*factor.denominator], this.#combineEncodedUnits(this.unit, factor.unit))\n        else {\n            const [num, den] = this.convertToFraction(factor);\n            return new Quantity([this.numerator*num, this.denominator*den], this.unit)\n        }\n    }\n    multiply(factor:number|bigint) {\n        if (factor === 1n || factor === 1) return;\n        const [num, den] = this.convertToFraction(factor);\n        this.setFraction(this.numerator*num, this.denominator*den);\n        return this;\n    }\n\n    quotient<D extends number|bigint|Quantity>(divisor:D): D extends Quantity ? Quantity : Quantity<U> {\n        if (divisor instanceof Quantity) return new Quantity([this.numerator*divisor.denominator,this.denominator*divisor.numerator], this.#combineEncodedUnits(this.unit, this.#invertEncodedUnit(divisor.unit)))\n        else {\n            const [num, den] = this.convertToFraction(divisor);\n            return new Quantity([this.numerator*den, this.denominator*num], this.unit)\n        }\n    }\n    divide(divisor:number|bigint) {\n        if (divisor === 1n || divisor === 1) return;\n        const [num, den] = this.convertToFraction(divisor);\n        this.setFraction(this.numerator*den, this.denominator*num);\n        return this;\n    }\n\n\n    sum(summand:Quantity):Quantity<U> {        \n        if (!this.hasSameDimension(summand)) throw new ValueError(\"Cannot add quantities, dimensions '\"+this.unit_formatted+\"' and '\"+summand.unit_formatted+\"' do not match\");\n        else {\n            // same denominator\n            if (this.denominator === summand.denominator) return new Quantity([this.numerator + summand.numerator, this.denominator], this.unit);\n\n            // find common denominator\n            const lcm = Quantity.#lcm(this.denominator, summand.denominator); \n            return new Quantity([this.numerator*(lcm/this.denominator) + summand.numerator*(lcm/summand.denominator), lcm], this.unit);\n        }\n    }\n    add(summand:Quantity) {\n        if (!this.hasSameDimension(summand)) throw new ValueError(\"Cannot add quantities, dimensions '\"+this.unit_formatted+\"' and '\"+summand.unit_formatted+\"' do not match\");\n        else {\n            // same denominator\n            if (this.denominator === summand.denominator) {\n                this.setFraction(this.numerator + summand.numerator, this.denominator);\n                return this;\n            }\n\n            // find common denominator\n            const lcm = Quantity.#lcm(this.denominator, summand.denominator); \n            this.setFraction(this.numerator*(lcm/this.denominator) + summand.numerator*(lcm/summand.denominator), lcm);\n            return this;\n        }\n    }\n\n\n    difference(subtrahend:Quantity):Quantity<U> {\n        if (!this.hasSameDimension(subtrahend)) throw new ValueError(\"Cannot subtract quantities, dimensions '\"+this.unit_formatted+\"' and '\"+subtrahend.unit_formatted+\"' do not match\");\n        else {\n            // same denominator\n            if (this.denominator === subtrahend.denominator) return new Quantity([this.numerator - subtrahend.numerator, this.denominator], this.unit);\n\n            // find common denominator\n            const lcm = Quantity.#lcm(this.denominator, subtrahend.denominator); \n            return new Quantity([this.numerator*(lcm/this.denominator) - subtrahend.numerator*(lcm/subtrahend.denominator), lcm], this.unit);\n        }\n    }\n    subtract(subtrahend:Quantity) {\n        if (!this.hasSameDimension(subtrahend)) throw new ValueError(\"Cannot subtract quantities, dimensions '\"+this.unit_formatted+\"' and '\"+subtrahend.unit_formatted+\"' do not match\");\n        else {\n            // same denominator\n            if (this.denominator === subtrahend.denominator) {\n                this.setFraction(this.numerator - subtrahend.numerator, this.denominator);\n                return this;\n            }\n\n            // find common denominator\n            const lcm = Quantity.#lcm(this.denominator, subtrahend.denominator); \n            this.setFraction(this.numerator*(lcm/this.denominator) - subtrahend.numerator*(lcm/subtrahend.denominator), lcm);\n            return this;\n        }\n    }\n\n    power(exponent:number|bigint) {\n        if (typeof exponent == \"bigint\" || Number.isInteger(exponent)) {\n            console.log(this.numerator, this.denominator, exponent)\n            if (exponent > 0) return new Quantity([this.numerator**BigInt(exponent), this.denominator**BigInt(exponent)], this.#raiseUnitToPower(this.unit, exponent))\n            else return new Quantity([this.denominator**BigInt(-exponent), this.numerator**BigInt(-exponent)], this.#raiseUnitToPower(this.unit, exponent))\n        }\n        else throw new ValueError(\"Quantity exponentiation requires an integer exponent\");\n    }\n\n    static compare(first:Quantity, second:Quantity):-1|0|1 {        \n        if (!first.hasSameDimension(second)) throw new ValueError(\"Cannot compare quantities, dimensions '\"+first.unit_formatted+\"' and '\"+second.unit_formatted+\"' do not match\");\n        else {\n            // find common denominator\n            const lcm = Quantity.#lcm(first.denominator, second.denominator); \n\n            return <(-1|0|1)> Math.sign(Number(first.numerator*(lcm/first.denominator) - second.numerator*(lcm/second.denominator)));\n        }\n    }\n\n\n    hasSameDimension(other:Quantity) {\n        return this.unit_binary === other?.unit_binary; // same binaries are always pointing to the same arraybuffer\n    }\n\n\n    // add addtional unit with exponent to encoded unit factor list\n    #addUnitAndExponent(encoded:unit, code:Unit, exponent:number){\n        // ignore dimensionless\n        if(code==Unit.DIMENSIONLESS) return;\n            \n        // combine with existing\n        let existing = false;\n        for (const el of encoded) {\n            if (el[0] == code)  {\n                el[1] += exponent;\n                // remove\n                if (el[1] == 0) encoded.splice(encoded.indexOf(el), 1);\n                existing = true;\n                break;\n            }\n        }\n        // add new\n        if (!existing) encoded.push([code, exponent])\n    }\n\n    #sortEncodedUnit(unit:unit) {\n        unit.sort((v1,v2)=>{\n            // '*' first, '/' last\n            if (v2[1] > 0 && v1[1] < 0) return 1;\n            if (v1[1] > 0 && v2[1] < 0) return -1;\n            return v2[0]-v1[0];\n        })\n    } \n    \n    // switch numerator and denominator\n    #invertEncodedUnit(unit:unit):unit {\n        return unit.map(val=>[val[0], -val[1]])\n    }\n\n    // add addtional unit with exponent to encoded unit factor list\n    #combineEncodedUnits(unit1:unit, unit2:unit) {\n        const new_unit = [...unit1];\n        for (const part of unit2) this.#addUnitAndExponent(new_unit, ...part);\n        this.#sortEncodedUnit(new_unit);\n        return new_unit;\n    }\n\n    valueOf() {\n        return this.value;\n    }\n\n\n    toString(formatting:Quantity.Formatting = Quantity.Formatting.WITH_ALIAS_UNIT, decimals?:number){\n        if (formatting == Quantity.Formatting.NO_UNIT) return this.#valueToString(false, decimals);\n        else return this.#valueToString(formatting == Quantity.Formatting.WITH_ALIAS_UNIT, decimals) + (formatting == Quantity.Formatting.WITH_ALIAS_UNIT ? this.unit_formatted_short : this.unit_formatted);\n    }\n\n    #valueToString(alias_factor=true, decimals?:number){\n        let numerator = this.#numerator;\n        let denominator = this.#denominator;\n\n        // divide by short_divisor to match alias factor\n        if (alias_factor) [numerator, denominator] = Quantity.#normalizeFraction(numerator*this.short_multiplier, denominator*this.short_divisor);\n\n        // fixed decimals\n        if (decimals != undefined) return (Number(numerator)/Number(denominator)).toFixed(decimals);\n        // finite decimal representation\n        if (this.#hasFiniteDecimalRep(denominator)) return this.#finiteFractionToDecimalString(numerator, denominator);\n        // fraction\n        else  return `${numerator}/${denominator}`\n    }\n\n    // assumes that the fraction can be represented as a finite decimal value!\n    #finiteFractionToDecimalString(numerator:bigint, denominator:bigint) {\n\n        let shift = denominator.toString().length; // absolute value\n\n        // TODO more efficient algorithm for this?\n\n        // get next higher denominator with power of 10\n\n        if (!Quantity.#isPowerOf10(denominator)) {\n\n            let found = false;\n            for (let x=0;x<10000;x++) { // only try 10000 iterations, works in first iteration in most cases\n\n\n                // d % 10^x = 0 => solve s\n\n                const new_denominator = 10n ** BigInt(shift) // new possible base 10 denominator\n\n                // is integer factor, can use as new denominator\n                if (new_denominator % denominator == 0n) {\n                    numerator *= new_denominator / denominator;\n                    found = true;\n                    break;\n                }\n                // try higher denominator \n                else shift++; \n            }\n\n            if (!found) throw new RuntimeError(\"Cannot convert unit to decimal fraction\")\n        }\n        else {\n            shift--;\n        }\n\n\n        const string = (numerator*BigInt(this.sign)).toString().padStart(shift,'0');\n        const comma_shift = string.length-shift;\n        const p1 = string.slice(0,comma_shift);\n        const p2 = string.slice(comma_shift)\n\n        return (this.sign==-1?'-':'') + p1 + (p2.length?(p1.length?'.':'0.'):'') + p2;\n    }\n\n}\n\n\n// deno-lint-ignore no-namespace\nexport namespace Quantity {\n    export enum Formatting {\n        WITH_ALIAS_UNIT,\n        WITH_UNIT,\n        NO_UNIT\n    }\n}"],"names":["Quantity","Formatting","Unit","UnitCodeBySymbol","UnitCodeBySymbolShortForms","UnitPrefixCodeBySymbol","UnitSymbolShortFormsByCode","UnitSymbol","UnitAliases","DerivedUnits","RuntimeError","SyntaxError","ValueError","cached_binaries","Map","known_aliases","EXPONENT_MIN","EXPONENT_MAX","numerator","denominator","is_finite_decimal","sign","value","setFraction","convertToFraction","Number","base_value","unit","unit_binary","unit_formatted","unit_formatted_short","short_divisor","short_multiplier","unit_factor_number","length","constructor","symbol_or_encoded_unit","Array","factor_num","factor_den","parseUnit","multiply","divide","setFormattedUnit","setUnitBinary","BigInt","gcd","number","isFinite","isNaN","factor","divisor","replace","includes","n","d","split","e","slice","value_parts","toString","join","n1","n2","t","i","power","new_exp","u","push","bigIntToBuffer","hex","len","u8","Uint8Array","j","parseInt","bufferToBigInt","buffer","forEach","h","hasBaseUnit","ArrayBuffer","uint8","dataview","DataView","code","exponent","setInt8","has","get","set","encoded","combined_factor_num","combined_factor_den","part","exp","startsWith","symbol","exponent_string","_exp","getExpandedSymbolWithPrefix","Math","prefixed_symbol","expanded_symbol","getExpandedSymbol","prefix_exp","DIMENSIONLESS","getCodeSymbol","abs_exponent","abs","formatted","is_first","format_divisor","format_multiplier","expression","alias","multiplicator","equals","other","hasSameDimension","product","num","den","quotient","sum","summand","lcm","add","difference","subtrahend","subtract","isInteger","console","log","compare","first","second","existing","el","splice","indexOf","sort","v1","v2","map","val","unit1","unit2","new_unit","valueOf","formatting","WITH_ALIAS_UNIT","decimals","NO_UNIT","alias_factor","undefined","toFixed","shift","found","x","new_denominator","string","padStart","comma_shift","p1","p2"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"quantity.ts"}