@c9up/atom 0.1.3 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/Decimal.d.ts +167 -0
- package/dist/Decimal.d.ts.map +1 -0
- package/dist/Decimal.js +513 -0
- package/dist/Decimal.js.map +1 -0
- package/dist/atlas.d.ts +60 -0
- package/dist/atlas.d.ts.map +1 -0
- package/dist/atlas.js +79 -0
- package/dist/atlas.js.map +1 -0
- package/dist/index.d.ts +70 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +216 -0
- package/dist/index.js.map +1 -0
- package/dist/math.d.ts +37 -0
- package/dist/math.d.ts.map +1 -0
- package/dist/math.js +187 -0
- package/dist/math.js.map +1 -0
- package/dist/native.d.ts +25 -0
- package/dist/native.d.ts.map +1 -0
- package/dist/native.js +80 -0
- package/dist/native.js.map +1 -0
- package/index.darwin-arm64.node +0 -0
- package/index.darwin-x64.node +0 -0
- package/index.linux-arm64-gnu.node +0 -0
- package/index.linux-x64-gnu.node +0 -0
- package/index.win32-x64-msvc.node +0 -0
- package/package.json +1 -1
- package/src/math.ts +3 -3
package/dist/math.js
ADDED
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
export function parseDecimal(input) {
|
|
2
|
+
const s = input.trim();
|
|
3
|
+
if (!s) {
|
|
4
|
+
throw new Error("Invalid decimal: empty string");
|
|
5
|
+
}
|
|
6
|
+
let sign = 1n;
|
|
7
|
+
let body = s;
|
|
8
|
+
if (body.startsWith("-")) {
|
|
9
|
+
sign = -1n;
|
|
10
|
+
body = body.slice(1);
|
|
11
|
+
}
|
|
12
|
+
else if (body.startsWith("+")) {
|
|
13
|
+
body = body.slice(1);
|
|
14
|
+
}
|
|
15
|
+
const parts = body.split(".");
|
|
16
|
+
if (parts.length > 2) {
|
|
17
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
18
|
+
}
|
|
19
|
+
const whole = parts[0] ?? "";
|
|
20
|
+
const frac = parts[1] ?? "";
|
|
21
|
+
if (!/^\d*$/.test(whole) || !/^\d*$/.test(frac)) {
|
|
22
|
+
throw new Error(`Invalid decimal: ${input}`);
|
|
23
|
+
}
|
|
24
|
+
const digits = `${whole}${frac}` || "0";
|
|
25
|
+
const int = BigInt(digits) * sign;
|
|
26
|
+
return { int, scale: frac.length };
|
|
27
|
+
}
|
|
28
|
+
export function formatDecimal(int, scale) {
|
|
29
|
+
if (scale === 0)
|
|
30
|
+
return int.toString();
|
|
31
|
+
const negative = int < 0n;
|
|
32
|
+
let s = (negative ? -int : int).toString();
|
|
33
|
+
if (s.length <= scale) {
|
|
34
|
+
s = `${"0".repeat(scale + 1 - s.length)}${s}`;
|
|
35
|
+
}
|
|
36
|
+
const split = s.length - scale;
|
|
37
|
+
const whole = s.slice(0, split);
|
|
38
|
+
let frac = s.slice(split);
|
|
39
|
+
frac = frac.replace(/0+$/, "");
|
|
40
|
+
let out = frac ? `${whole}.${frac}` : whole;
|
|
41
|
+
if (negative && out !== "0")
|
|
42
|
+
out = `-${out}`;
|
|
43
|
+
return out;
|
|
44
|
+
}
|
|
45
|
+
export function addTs(a, b) {
|
|
46
|
+
const da = parseDecimal(a);
|
|
47
|
+
const db = parseDecimal(b);
|
|
48
|
+
const [ai, bi, scale] = alignScale(da, db);
|
|
49
|
+
return formatDecimal(ai + bi, scale);
|
|
50
|
+
}
|
|
51
|
+
export function subTs(a, b) {
|
|
52
|
+
const da = parseDecimal(a);
|
|
53
|
+
const db = parseDecimal(b);
|
|
54
|
+
const [ai, bi, scale] = alignScale(da, db);
|
|
55
|
+
return formatDecimal(ai - bi, scale);
|
|
56
|
+
}
|
|
57
|
+
export function mulTs(a, b) {
|
|
58
|
+
const da = parseDecimal(a);
|
|
59
|
+
const db = parseDecimal(b);
|
|
60
|
+
return formatDecimal(da.int * db.int, da.scale + db.scale);
|
|
61
|
+
}
|
|
62
|
+
export function divTs(a, b, precision) {
|
|
63
|
+
const da = parseDecimal(a);
|
|
64
|
+
const db = parseDecimal(b);
|
|
65
|
+
if (db.int === 0n) {
|
|
66
|
+
throw new Error("Division by zero");
|
|
67
|
+
}
|
|
68
|
+
const numerator = da.int * pow10BigInt(precision + db.scale);
|
|
69
|
+
const denominator = db.int * pow10BigInt(da.scale);
|
|
70
|
+
const q = numerator / denominator;
|
|
71
|
+
return formatDecimal(q, precision);
|
|
72
|
+
}
|
|
73
|
+
export function cmpTs(a, b) {
|
|
74
|
+
const da = parseDecimal(a);
|
|
75
|
+
const db = parseDecimal(b);
|
|
76
|
+
const [ai, bi] = alignScale(da, db);
|
|
77
|
+
if (ai < bi)
|
|
78
|
+
return -1;
|
|
79
|
+
if (ai > bi)
|
|
80
|
+
return 1;
|
|
81
|
+
return 0;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Align two parsed decimals to the same scale by multiplying the less-precise
|
|
85
|
+
* one by `10^(scaleDelta)`. Used by the TS arithmetic helpers below
|
|
86
|
+
* (add/sub/cmp/mod). NOTE: `Decimal.ts` does NOT import this — it aligns scales
|
|
87
|
+
* inline via `pow10BigInt`, so this is not a shared-dedup point.
|
|
88
|
+
*/
|
|
89
|
+
export function alignScale(a, b) {
|
|
90
|
+
if (a.scale === b.scale)
|
|
91
|
+
return [a.int, b.int, a.scale];
|
|
92
|
+
if (a.scale > b.scale) {
|
|
93
|
+
const factor = pow10BigInt(a.scale - b.scale);
|
|
94
|
+
return [a.int, b.int * factor, a.scale];
|
|
95
|
+
}
|
|
96
|
+
const factor = pow10BigInt(b.scale - a.scale);
|
|
97
|
+
return [a.int * factor, b.int, b.scale];
|
|
98
|
+
}
|
|
99
|
+
/** Exact `10^exp` as a `bigint`. Exported — single definition for the whole TS side. */
|
|
100
|
+
export function pow10BigInt(exp) {
|
|
101
|
+
let acc = 1n;
|
|
102
|
+
for (let i = 0; i < exp; i++)
|
|
103
|
+
acc *= 10n;
|
|
104
|
+
return acc;
|
|
105
|
+
}
|
|
106
|
+
/**
|
|
107
|
+
* Pure-TS modulo — fallback for when the native engine is unavailable. The
|
|
108
|
+
* Rust `rem` path should be preferred when `isNativeAvailable()`.
|
|
109
|
+
*/
|
|
110
|
+
export function modTs(a, b) {
|
|
111
|
+
const da = parseDecimal(a);
|
|
112
|
+
const db = parseDecimal(b);
|
|
113
|
+
if (db.int === 0n) {
|
|
114
|
+
throw new Error("Division by zero");
|
|
115
|
+
}
|
|
116
|
+
const [ai, bi, scale] = alignScale(da, db);
|
|
117
|
+
return formatDecimal(ai % bi, scale);
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Pure-TS integer exponentiation with truncating div for negative exponents.
|
|
121
|
+
* Mirrors the Rust `pow` contract so the two paths produce identical results.
|
|
122
|
+
*/
|
|
123
|
+
export function powTs(a, exp, precision) {
|
|
124
|
+
if (!Number.isInteger(exp)) {
|
|
125
|
+
throw new Error(`Invalid exponent: ${exp}`);
|
|
126
|
+
}
|
|
127
|
+
if (exp === 0)
|
|
128
|
+
return "1";
|
|
129
|
+
if (exp < 0) {
|
|
130
|
+
return divTs("1", powTs(a, -exp, precision), precision);
|
|
131
|
+
}
|
|
132
|
+
const base = parseDecimal(a);
|
|
133
|
+
let resultInt = 1n;
|
|
134
|
+
let resultScale = 0;
|
|
135
|
+
let currentInt = base.int;
|
|
136
|
+
let currentScale = base.scale;
|
|
137
|
+
let e = exp;
|
|
138
|
+
while (e > 0) {
|
|
139
|
+
if (e & 1) {
|
|
140
|
+
resultInt *= currentInt;
|
|
141
|
+
resultScale += currentScale;
|
|
142
|
+
}
|
|
143
|
+
e >>= 1;
|
|
144
|
+
if (e > 0) {
|
|
145
|
+
currentInt *= currentInt;
|
|
146
|
+
currentScale *= 2;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return formatDecimal(resultInt, resultScale);
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Pure-TS integer square root via Newton's iteration on BigInt, scaled to
|
|
153
|
+
* produce `precision` fractional digits. Truncates toward zero; rounding
|
|
154
|
+
* modes are applied by the caller.
|
|
155
|
+
*/
|
|
156
|
+
export function sqrtTs(a, precision) {
|
|
157
|
+
const parsed = parseDecimal(a);
|
|
158
|
+
if (parsed.int < 0n) {
|
|
159
|
+
throw new Error("Cannot compute sqrt of a negative decimal");
|
|
160
|
+
}
|
|
161
|
+
if (parsed.int === 0n)
|
|
162
|
+
return "0";
|
|
163
|
+
const factorExp = 2 * precision - parsed.scale;
|
|
164
|
+
let radicand = parsed.int;
|
|
165
|
+
if (factorExp >= 0) {
|
|
166
|
+
radicand *= pow10BigInt(factorExp);
|
|
167
|
+
}
|
|
168
|
+
else {
|
|
169
|
+
radicand /= pow10BigInt(-factorExp);
|
|
170
|
+
}
|
|
171
|
+
const root = bigintSqrt(radicand);
|
|
172
|
+
return formatDecimal(root, precision);
|
|
173
|
+
}
|
|
174
|
+
function bigintSqrt(value) {
|
|
175
|
+
if (value < 0n)
|
|
176
|
+
throw new Error("Cannot compute sqrt of negative bigint");
|
|
177
|
+
if (value < 2n)
|
|
178
|
+
return value;
|
|
179
|
+
let x0 = value;
|
|
180
|
+
let x1 = (x0 + value / x0) / 2n;
|
|
181
|
+
while (x1 < x0) {
|
|
182
|
+
x0 = x1;
|
|
183
|
+
x1 = (x0 + value / x0) / 2n;
|
|
184
|
+
}
|
|
185
|
+
return x0;
|
|
186
|
+
}
|
|
187
|
+
//# sourceMappingURL=math.js.map
|
package/dist/math.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"math.js","sourceRoot":"","sources":["../src/math.ts"],"names":[],"mappings":"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"}
|
package/dist/native.d.ts
ADDED
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal engine loader — auto-detects Node (NAPI) vs Browser (WASM).
|
|
3
|
+
*
|
|
4
|
+
* - **Node**: loads the prebuilt `.node` binary via `createRequire` (sync, fast)
|
|
5
|
+
* - **Browser**: loads the `.wasm` binary via the wasm-pack JS glue (async init on
|
|
6
|
+
* first module import via top-level await, then sync function calls)
|
|
7
|
+
*
|
|
8
|
+
* The consumer imports `nativeAtom()` and gets the same `NativeAtom` interface
|
|
9
|
+
* regardless of the environment. No conditional imports needed at the call site.
|
|
10
|
+
*/
|
|
11
|
+
export interface NativeAtom {
|
|
12
|
+
add(a: string, b: string): string;
|
|
13
|
+
sub(a: string, b: string): string;
|
|
14
|
+
mul(a: string, b: string): string;
|
|
15
|
+
div(a: string, b: string, precision: number): string;
|
|
16
|
+
rem(a: string, b: string): string;
|
|
17
|
+
pow(a: string, exp: number, precision: number): string;
|
|
18
|
+
sqrt(a: string, precision: number): string;
|
|
19
|
+
cmp(a: string, b: string): number;
|
|
20
|
+
}
|
|
21
|
+
/** Whether the native engine (NAPI or WASM) loaded successfully. */
|
|
22
|
+
export declare function isNativeAvailable(): boolean;
|
|
23
|
+
export declare function nativeAtom(): NativeAtom;
|
|
24
|
+
export declare function __overrideNativeForTesting(impl: NativeAtom | null | undefined): void;
|
|
25
|
+
//# sourceMappingURL=native.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.d.ts","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,MAAM,WAAW,UAAU;IAC1B,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACrD,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAClC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IACvD,IAAI,CAAC,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,MAAM,CAAC;IAC3C,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CAClC;AAgDD,oEAAoE;AACpE,wBAAgB,iBAAiB,IAAI,OAAO,CAI3C;AAED,wBAAgB,UAAU,IAAI,UAAU,CAmBvC;AAKD,wBAAgB,0BAA0B,CACzC,IAAI,EAAE,UAAU,GAAG,IAAI,GAAG,SAAS,GACjC,IAAI,CAEN"}
|
package/dist/native.js
ADDED
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Universal engine loader — auto-detects Node (NAPI) vs Browser (WASM).
|
|
3
|
+
*
|
|
4
|
+
* - **Node**: loads the prebuilt `.node` binary via `createRequire` (sync, fast)
|
|
5
|
+
* - **Browser**: loads the `.wasm` binary via the wasm-pack JS glue (async init on
|
|
6
|
+
* first module import via top-level await, then sync function calls)
|
|
7
|
+
*
|
|
8
|
+
* The consumer imports `nativeAtom()` and gets the same `NativeAtom` interface
|
|
9
|
+
* regardless of the environment. No conditional imports needed at the call site.
|
|
10
|
+
*/
|
|
11
|
+
let native;
|
|
12
|
+
let loadError;
|
|
13
|
+
const isNode = typeof globalThis.process !== "undefined" &&
|
|
14
|
+
typeof globalThis.process.versions?.node === "string";
|
|
15
|
+
if (isNode) {
|
|
16
|
+
// Node path: load NAPI binary (sync).
|
|
17
|
+
try {
|
|
18
|
+
const { createRequire } = await import("node:module");
|
|
19
|
+
const { dirname, join } = await import("node:path");
|
|
20
|
+
const { fileURLToPath } = await import("node:url");
|
|
21
|
+
const { arch, platform } = await import("node:process");
|
|
22
|
+
const nodeRequire = createRequire(import.meta.url);
|
|
23
|
+
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
24
|
+
const platformMap = {
|
|
25
|
+
"linux-x64": "linux-x64-gnu",
|
|
26
|
+
"linux-arm64": "linux-arm64-gnu",
|
|
27
|
+
"darwin-x64": "darwin-x64",
|
|
28
|
+
"darwin-arm64": "darwin-arm64",
|
|
29
|
+
"win32-x64": "win32-x64-msvc",
|
|
30
|
+
};
|
|
31
|
+
const suffix = platformMap[`${platform}-${arch}`];
|
|
32
|
+
if (suffix) {
|
|
33
|
+
native = nodeRequire(join(currentDir, `../index.${suffix}.node`));
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
catch (e) {
|
|
37
|
+
loadError = e;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
else {
|
|
41
|
+
// Browser path: load WASM (async init, then sync calls).
|
|
42
|
+
try {
|
|
43
|
+
const wasm = await import("../wasm/atom_engine_wasm.js");
|
|
44
|
+
await wasm.default();
|
|
45
|
+
native = wasm;
|
|
46
|
+
}
|
|
47
|
+
catch (e) {
|
|
48
|
+
loadError = e;
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
/** Whether the native engine (NAPI or WASM) loaded successfully. */
|
|
52
|
+
export function isNativeAvailable() {
|
|
53
|
+
if (overrideNative === null)
|
|
54
|
+
return false;
|
|
55
|
+
if (overrideNative !== undefined)
|
|
56
|
+
return true;
|
|
57
|
+
return native !== undefined;
|
|
58
|
+
}
|
|
59
|
+
export function nativeAtom() {
|
|
60
|
+
if (overrideNative !== undefined) {
|
|
61
|
+
if (overrideNative === null) {
|
|
62
|
+
throw new Error("[ATOM_NAPI_DISABLED] Native engine is disabled (test override)");
|
|
63
|
+
}
|
|
64
|
+
return overrideNative;
|
|
65
|
+
}
|
|
66
|
+
if (!native) {
|
|
67
|
+
throw new Error(`[ATOM_ENGINE_NOT_FOUND] Decimal engine not available.\n` +
|
|
68
|
+
` Environment: ${isNode ? "Node" : "Browser"}\n` +
|
|
69
|
+
` Reason: ${loadError ?? "binary not found"}\n` +
|
|
70
|
+
` Fix (Node): cd packages/atom && pnpm build:napi\n` +
|
|
71
|
+
` Fix (Browser): cd packages/atom && pnpm build:wasm`);
|
|
72
|
+
}
|
|
73
|
+
return native;
|
|
74
|
+
}
|
|
75
|
+
// Test override (unchanged from before)
|
|
76
|
+
let overrideNative;
|
|
77
|
+
export function __overrideNativeForTesting(impl) {
|
|
78
|
+
overrideNative = impl;
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAaH,IAAI,MAA8B,CAAC;AACnC,IAAI,SAAkB,CAAC;AAEvB,MAAM,MAAM,GACX,OAAO,UAAU,CAAC,OAAO,KAAK,WAAW;IACzC,OAAO,UAAU,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,KAAK,QAAQ,CAAC;AAEvD,IAAI,MAAM,EAAE,CAAC;IACZ,sCAAsC;IACtC,IAAI,CAAC;QACJ,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC;QACtD,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC,CAAC;QACpD,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,UAAU,CAAC,CAAC;QACnD,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QAExD,MAAM,WAAW,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QACnD,MAAM,UAAU,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QAE3D,MAAM,WAAW,GAA2B;YAC3C,WAAW,EAAE,eAAe;YAC5B,aAAa,EAAE,iBAAiB;YAChC,YAAY,EAAE,YAAY;YAC1B,cAAc,EAAE,cAAc;YAC9B,WAAW,EAAE,gBAAgB;SAC7B,CAAC;QAEF,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,QAAQ,IAAI,IAAI,EAAE,CAAC,CAAC;QAClD,IAAI,MAAM,EAAE,CAAC;YACZ,MAAM,GAAG,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,MAAM,OAAO,CAAC,CAAC,CAAC;QACnE,CAAC;IACF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,SAAS,GAAG,CAAC,CAAC;IACf,CAAC;AACF,CAAC;KAAM,CAAC;IACP,yDAAyD;IACzD,IAAI,CAAC;QACJ,MAAM,IAAI,GAAqD,MAAM,MAAM,CAC1E,6BAA6B,CAC7B,CAAC;QACF,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QACrB,MAAM,GAAG,IAAI,CAAC;IACf,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,SAAS,GAAG,CAAC,CAAC;IACf,CAAC;AACF,CAAC;AAED,oEAAoE;AACpE,MAAM,UAAU,iBAAiB;IAChC,IAAI,cAAc,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC1C,IAAI,cAAc,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO,MAAM,KAAK,SAAS,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,UAAU;IACzB,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,cAAc,KAAK,IAAI,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACd,gEAAgE,CAChE,CAAC;QACH,CAAC;QACD,OAAO,cAAc,CAAC;IACvB,CAAC;IACD,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,MAAM,IAAI,KAAK,CACd,yDAAyD;YACxD,kBAAkB,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI;YACjD,aAAa,SAAS,IAAI,kBAAkB,IAAI;YAChD,qDAAqD;YACrD,sDAAsD,CACvD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AACf,CAAC;AAED,wCAAwC;AACxC,IAAI,cAA6C,CAAC;AAElD,MAAM,UAAU,0BAA0B,CACzC,IAAmC;IAEnC,cAAc,GAAG,IAAI,CAAC;AACvB,CAAC"}
|
package/index.darwin-arm64.node
CHANGED
|
Binary file
|
package/index.darwin-x64.node
CHANGED
|
Binary file
|
|
Binary file
|
package/index.linux-x64-gnu.node
CHANGED
|
Binary file
|
|
Binary file
|
package/package.json
CHANGED
package/src/math.ts
CHANGED
|
@@ -95,9 +95,9 @@ export function cmpTs(a: string, b: string): -1 | 0 | 1 {
|
|
|
95
95
|
|
|
96
96
|
/**
|
|
97
97
|
* Align two parsed decimals to the same scale by multiplying the less-precise
|
|
98
|
-
* one by `10^(scaleDelta)`.
|
|
99
|
-
*
|
|
100
|
-
* `
|
|
98
|
+
* one by `10^(scaleDelta)`. Used by the TS arithmetic helpers below
|
|
99
|
+
* (add/sub/cmp/mod). NOTE: `Decimal.ts` does NOT import this — it aligns scales
|
|
100
|
+
* inline via `pow10BigInt`, so this is not a shared-dedup point.
|
|
101
101
|
*/
|
|
102
102
|
export function alignScale(
|
|
103
103
|
a: ParsedDecimal,
|