{"version":3,"file":"_decimal.mjs","names":[],"sources":["../../src/internal/_decimal.ts"],"sourcesContent":["export interface _IDecimal {\n  coefficient: bigint;\n  exponent: number;\n}\n\nexport interface _IDecimalRatio {\n  numerator: bigint;\n  denominator: bigint;\n}\n\nexport const _decimalDecompose = (value: number): _IDecimal | null => {\n  if (Number.isFinite(value) === false) return null;\n  const [mantissa = \"0\", exponentText = \"0\"] = value.toString().split(\"e\");\n  const negative: boolean = mantissa.startsWith(\"-\");\n  const unsigned: string = negative ? mantissa.slice(1) : mantissa;\n  const point: number = unsigned.indexOf(\".\");\n  const decimals: number = point === -1 ? 0 : unsigned.length - point - 1;\n  const digits: bigint = BigInt(unsigned.replace(\".\", \"\"));\n  return {\n    coefficient: negative ? -digits : digits,\n    exponent: Number(exponentText) - decimals,\n  };\n};\n\nexport const _decimalDivide = (\n  value: number,\n  divisor: _IDecimal,\n): _IDecimalRatio | null => {\n  const dividend: _IDecimal | null = _decimalDecompose(value);\n  if (dividend === null || divisor.coefficient === BigInt(0)) return null;\n  const exponent: number = dividend.exponent - divisor.exponent;\n  return exponent >= 0\n    ? {\n        numerator: dividend.coefficient * _decimalPower(exponent),\n        denominator: divisor.coefficient,\n      }\n    : {\n        numerator: dividend.coefficient,\n        denominator: divisor.coefficient * _decimalPower(-exponent),\n      };\n};\n\nexport const _decimalIntegerStep = (value: number): _IDecimal | null => {\n  const decimal: _IDecimal | null = _decimalDecompose(value);\n  if (decimal === null || decimal.coefficient <= BigInt(0)) return null;\n  if (decimal.exponent >= 0)\n    return {\n      coefficient: decimal.coefficient * _decimalPower(decimal.exponent),\n      exponent: 0,\n    };\n\n  const denominator: bigint = _decimalPower(-decimal.exponent);\n  return {\n    coefficient:\n      decimal.coefficient / _decimalGcd(decimal.coefficient, denominator),\n    exponent: 0,\n  };\n};\n\nexport const _decimalToNumber = (value: _IDecimal): number =>\n  Number(`${value.coefficient}e${value.exponent}`);\n\nexport const _decimalPower = (exponent: number): bigint =>\n  BigInt(10) ** BigInt(exponent);\n\nexport const _decimalGcd = (x: bigint, y: bigint): bigint => {\n  while (y !== BigInt(0)) [x, y] = [y, x % y];\n  return x < BigInt(0) ? -x : x;\n};\n"],"mappings":";AAUA,MAAa,qBAAqB,UAAoC;CACpE,IAAI,OAAO,SAAS,KAAK,MAAM,OAAO,OAAO;CAC7C,MAAM,CAAC,WAAW,KAAK,eAAe,OAAO,MAAM,SAAS,CAAC,CAAC,MAAM,GAAG;CACvE,MAAM,WAAoB,SAAS,WAAW,GAAG;CACjD,MAAM,WAAmB,WAAW,SAAS,MAAM,CAAC,IAAI;CACxD,MAAM,QAAgB,SAAS,QAAQ,GAAG;CAC1C,MAAM,WAAmB,UAAU,KAAK,IAAI,SAAS,SAAS,QAAQ;CACtE,MAAM,SAAiB,OAAO,SAAS,QAAQ,KAAK,EAAE,CAAC;CACvD,OAAO;EACL,aAAa,WAAW,CAAC,SAAS;EAClC,UAAU,OAAO,YAAY,IAAI;CACnC;AACF;AAEA,MAAa,kBACX,OACA,YAC0B;CAC1B,MAAM,WAA6B,kBAAkB,KAAK;CAC1D,IAAI,aAAa,QAAQ,QAAQ,gBAAgB,OAAO,CAAC,GAAG,OAAO;CACnE,MAAM,WAAmB,SAAS,WAAW,QAAQ;CACrD,OAAO,YAAY,IACf;EACE,WAAW,SAAS,cAAc,cAAc,QAAQ;EACxD,aAAa,QAAQ;CACvB,IACA;EACE,WAAW,SAAS;EACpB,aAAa,QAAQ,cAAc,cAAc,CAAC,QAAQ;CAC5D;AACN;AAEA,MAAa,uBAAuB,UAAoC;CACtE,MAAM,UAA4B,kBAAkB,KAAK;CACzD,IAAI,YAAY,QAAQ,QAAQ,eAAe,OAAO,CAAC,GAAG,OAAO;CACjE,IAAI,QAAQ,YAAY,GACtB,OAAO;EACL,aAAa,QAAQ,cAAc,cAAc,QAAQ,QAAQ;EACjE,UAAU;CACZ;CAEF,MAAM,cAAsB,cAAc,CAAC,QAAQ,QAAQ;CAC3D,OAAO;EACL,aACE,QAAQ,cAAc,YAAY,QAAQ,aAAa,WAAW;EACpE,UAAU;CACZ;AACF;AAEA,MAAa,oBAAoB,UAC/B,OAAO,GAAG,MAAM,YAAY,GAAG,MAAM,UAAU;AAEjD,MAAa,iBAAiB,aAC5B,OAAO,EAAE,KAAK,OAAO,QAAQ;AAE/B,MAAa,eAAe,GAAW,MAAsB;CAC3D,OAAO,MAAM,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,IAAI,CAAC;CAC1C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI;AAC9B"}