@hazae41/fixed 1.0.0
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/README.md +26 -0
- package/dist/cjs/index.cjs +10 -0
- package/dist/cjs/index.cjs.map +1 -0
- package/dist/cjs/libs/bigint/index.cjs +10 -0
- package/dist/cjs/libs/bigint/index.cjs.map +1 -0
- package/dist/cjs/mods/fixed/index.cjs +138 -0
- package/dist/cjs/mods/fixed/index.cjs.map +1 -0
- package/dist/esm/index.mjs +2 -0
- package/dist/esm/index.mjs.map +1 -0
- package/dist/esm/libs/bigint/index.mjs +10 -0
- package/dist/esm/libs/bigint/index.mjs.map +1 -0
- package/dist/esm/mods/fixed/index.mjs +134 -0
- package/dist/esm/mods/fixed/index.mjs.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/mods/fixed/index.d.ts +55 -0
- package/package.json +50 -0
package/README.md
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
# Fixed
|
|
2
|
+
|
|
3
|
+
Fixed-point numbers in idiomatic TypeScript
|
|
4
|
+
|
|
5
|
+
```bash
|
|
6
|
+
npm i @hazae41/fixed
|
|
7
|
+
```
|
|
8
|
+
|
|
9
|
+
[**Node Package 📦**](https://www.npmjs.com/package/@hazae41/fixed)
|
|
10
|
+
|
|
11
|
+
## Features
|
|
12
|
+
|
|
13
|
+
### Current features
|
|
14
|
+
- 100% TypeScript and ESM
|
|
15
|
+
- No external dependencies
|
|
16
|
+
|
|
17
|
+
## Usage
|
|
18
|
+
|
|
19
|
+
```tsx
|
|
20
|
+
const eth = new Fixed(123n, 0) // 123n
|
|
21
|
+
const wei = fixed.move(18) // 123000000000000000000n
|
|
22
|
+
|
|
23
|
+
const wei2 = wei.add(new Fixed(1n, 18)) // 123000000000000000001n
|
|
24
|
+
|
|
25
|
+
const str = wei2.toString() // "123.000000000000000001"
|
|
26
|
+
```
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/libs/bigint/index.ts"],"sourcesContent":["\nexport namespace BigInts {\n\n export function tensOf(value: number) {\n return 10n ** BigInt(value)\n }\n\n}"],"names":["BigInts","tensOf","value","BigInt"],"mappings":";;;AACiBA,CAAAA,SAAAA,OAAAA,EAAAA;AAER,IAAA,SAASC,OAAOC,KAAa,EAAA;QAClC,OAAO,GAAG,IAAIC,MAAOD,CAAAA,KAAAA,CAAAA;AACvB;YAFgBD,MAAAA,GAAAA,MAAAA;AAIlB,CAAA,EANiBD,eAAAA,KAAAA,eAAAA,GAAAA,EAAAA,CAAAA,CAAAA;;"}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var hex = require('@hazae41/hex');
|
|
4
|
+
var index = require('../../libs/bigint/index.cjs');
|
|
5
|
+
|
|
6
|
+
class ZeroHexFixedInit {
|
|
7
|
+
value;
|
|
8
|
+
decimals;
|
|
9
|
+
constructor(value, decimals){
|
|
10
|
+
this.value = value;
|
|
11
|
+
this.decimals = decimals;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
class BigIntFixedInit {
|
|
15
|
+
value;
|
|
16
|
+
decimals;
|
|
17
|
+
constructor(value, decimals){
|
|
18
|
+
this.value = value;
|
|
19
|
+
this.decimals = decimals;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
class Fixed {
|
|
23
|
+
value;
|
|
24
|
+
decimals;
|
|
25
|
+
tens;
|
|
26
|
+
constructor(value, decimals){
|
|
27
|
+
this.value = value;
|
|
28
|
+
this.decimals = decimals;
|
|
29
|
+
this.tens = index.BigInts.tensOf(decimals);
|
|
30
|
+
}
|
|
31
|
+
static unit(decimals) {
|
|
32
|
+
return new Fixed(index.BigInts.tensOf(decimals), decimals);
|
|
33
|
+
}
|
|
34
|
+
static from(init) {
|
|
35
|
+
if (init instanceof Fixed) return init;
|
|
36
|
+
if (typeof init.value === "string") return Fixed.fromZeroHexString(init.value, init.decimals);
|
|
37
|
+
return new Fixed(init.value, init.decimals);
|
|
38
|
+
}
|
|
39
|
+
static fromZeroHexInit(init) {
|
|
40
|
+
return Fixed.fromZeroHexString(init.value, init.decimals);
|
|
41
|
+
}
|
|
42
|
+
static fromBigIntInit(init) {
|
|
43
|
+
return new Fixed(init.value, init.decimals);
|
|
44
|
+
}
|
|
45
|
+
static fromZeroHexString(value, decimals) {
|
|
46
|
+
return new Fixed(hex.ZeroHexString.toBigInt(value), decimals);
|
|
47
|
+
}
|
|
48
|
+
static fromDecimalString(text, decimals) {
|
|
49
|
+
const [whole = "0", decimal = "0"] = text.split(".");
|
|
50
|
+
const value = BigInt(whole + decimal.padEnd(decimals, "0").slice(0, decimals));
|
|
51
|
+
return new Fixed(value, decimals);
|
|
52
|
+
}
|
|
53
|
+
static fromString(text, decimals) {
|
|
54
|
+
if (hex.ZeroHexString.String.is(text)) return Fixed.fromZeroHexString(text, decimals);
|
|
55
|
+
return Fixed.fromDecimalString(text, decimals);
|
|
56
|
+
}
|
|
57
|
+
toZeroHexInit() {
|
|
58
|
+
return new ZeroHexFixedInit(this.toZeroHexString(), this.decimals);
|
|
59
|
+
}
|
|
60
|
+
toBigIntInit() {
|
|
61
|
+
return new BigIntFixedInit(this.value, this.decimals);
|
|
62
|
+
}
|
|
63
|
+
toZeroHexString() {
|
|
64
|
+
return hex.ZeroHexString.fromBigInt(this.value);
|
|
65
|
+
}
|
|
66
|
+
toDecimalString() {
|
|
67
|
+
const raw = this.value.toString().padStart(this.decimals, "0");
|
|
68
|
+
const whole = raw.slice(0, raw.length - this.decimals).replaceAll("0", " ").trimStart().replaceAll(" ", "0");
|
|
69
|
+
const decimal = raw.slice(raw.length - this.decimals).replaceAll("0", " ").trimEnd().replaceAll(" ", "0");
|
|
70
|
+
if (!decimal) return whole || "0";
|
|
71
|
+
return `${whole || "0"}.${decimal}`;
|
|
72
|
+
}
|
|
73
|
+
toString() {
|
|
74
|
+
return this.toDecimalString();
|
|
75
|
+
}
|
|
76
|
+
toJSON() {
|
|
77
|
+
return this.toZeroHexInit();
|
|
78
|
+
}
|
|
79
|
+
as(decimals) {
|
|
80
|
+
return new Fixed(this.value, decimals);
|
|
81
|
+
}
|
|
82
|
+
move(decimals) {
|
|
83
|
+
if (this.decimals > decimals) return new Fixed(this.value / index.BigInts.tensOf(this.decimals - decimals), decimals);
|
|
84
|
+
if (this.decimals < decimals) return new Fixed(this.value * index.BigInts.tensOf(decimals - this.decimals), decimals);
|
|
85
|
+
return this;
|
|
86
|
+
}
|
|
87
|
+
add(other) {
|
|
88
|
+
const dx = this.decimals;
|
|
89
|
+
const dy = other.decimals;
|
|
90
|
+
const dr = Math.max(dx, dy);
|
|
91
|
+
const tr = index.BigInts.tensOf(dr);
|
|
92
|
+
const tx = this.tens;
|
|
93
|
+
const ty = other.tens;
|
|
94
|
+
const vx = this.value;
|
|
95
|
+
const vy = other.value;
|
|
96
|
+
return new Fixed(vx * (tr / tx) + vy * (tr / ty), dr);
|
|
97
|
+
}
|
|
98
|
+
sub(other) {
|
|
99
|
+
const dx = this.decimals;
|
|
100
|
+
const dy = other.decimals;
|
|
101
|
+
const dr = Math.max(dx, dy);
|
|
102
|
+
const tr = index.BigInts.tensOf(dr);
|
|
103
|
+
const tx = this.tens;
|
|
104
|
+
const ty = other.tens;
|
|
105
|
+
const vx = this.value;
|
|
106
|
+
const vy = other.value;
|
|
107
|
+
return new Fixed(vx * (tr / tx) - vy * (tr / ty), dr);
|
|
108
|
+
}
|
|
109
|
+
mul(other) {
|
|
110
|
+
const dx = this.decimals;
|
|
111
|
+
const dy = other.decimals;
|
|
112
|
+
const dr = dx + dy;
|
|
113
|
+
const vx = this.value;
|
|
114
|
+
const vy = other.value;
|
|
115
|
+
return new Fixed(vx * vy, dr);
|
|
116
|
+
}
|
|
117
|
+
div(other) {
|
|
118
|
+
const dx = this.decimals;
|
|
119
|
+
const ty = other.tens;
|
|
120
|
+
const vx = this.value;
|
|
121
|
+
const vy = other.value;
|
|
122
|
+
return new Fixed(vx * ty / vy, dx);
|
|
123
|
+
}
|
|
124
|
+
floor() {
|
|
125
|
+
return new Fixed(this.value - this.value % this.tens, this.decimals);
|
|
126
|
+
}
|
|
127
|
+
ceil() {
|
|
128
|
+
return new Fixed(this.value + (this.tens - this.value % this.tens), this.decimals);
|
|
129
|
+
}
|
|
130
|
+
round() {
|
|
131
|
+
return new Fixed(this.value + this.tens / 2n - (this.value + this.tens / 2n) % this.tens, this.decimals);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
exports.BigIntFixedInit = BigIntFixedInit;
|
|
136
|
+
exports.Fixed = Fixed;
|
|
137
|
+
exports.ZeroHexFixedInit = ZeroHexFixedInit;
|
|
138
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","sources":["../../../../src/mods/fixed/index.ts"],"sourcesContent":["import { ZeroHexString } from \"@hazae41/hex\"\nimport { BigInts } from \"libs/bigint/index.js\"\n\nexport interface ZeroHexFixedInit<D extends number = number> {\n readonly value: ZeroHexString,\n readonly decimals: D\n}\n\nexport class ZeroHexFixedInit<D extends number = number> {\n\n constructor(\n readonly value: ZeroHexString,\n readonly decimals: D\n ) { }\n\n}\n\nexport interface BigIntFixedInit<D extends number = number> {\n readonly value: bigint,\n readonly decimals: D\n}\n\nexport class BigIntFixedInit<D extends number = number> {\n\n constructor(\n readonly value: bigint,\n readonly decimals: D\n ) { }\n\n}\n\nexport namespace Fixed {\n\n export type From<D extends number = number> =\n | BigIntFixedInit<D>\n | ZeroHexFixedInit<D>\n\n}\n\nexport class Fixed<D extends number = number> implements BigIntFixedInit {\n\n readonly tens: bigint\n\n constructor(\n readonly value: bigint,\n readonly decimals: D\n ) {\n this.tens = BigInts.tensOf(decimals)\n }\n\n static unit<D extends number = number>(decimals: D) {\n return new Fixed(BigInts.tensOf(decimals), decimals)\n }\n\n static from<D extends number = number>(init: Fixed.From<D>) {\n if (init instanceof Fixed)\n return init\n if (typeof init.value === \"string\")\n return Fixed.fromZeroHexString(init.value, init.decimals)\n return new Fixed(init.value, init.decimals)\n }\n\n static fromZeroHexInit<D extends number>(init: ZeroHexFixedInit<D>) {\n return Fixed.fromZeroHexString(init.value, init.decimals)\n }\n\n static fromBigIntInit<D extends number>(init: BigIntFixedInit<D>) {\n return new Fixed(init.value, init.decimals)\n }\n\n static fromZeroHexString<D extends number>(value: ZeroHexString, decimals: D) {\n return new Fixed(ZeroHexString.toBigInt(value), decimals)\n }\n\n static fromDecimalString<D extends number>(text: string, decimals: D) {\n const [whole = \"0\", decimal = \"0\"] = text.split(\".\")\n\n const value = BigInt(whole + decimal.padEnd(decimals, \"0\").slice(0, decimals))\n\n return new Fixed(value, decimals)\n }\n\n static fromString<D extends number>(text: string, decimals: D) {\n if (ZeroHexString.String.is(text))\n return Fixed.fromZeroHexString(text, decimals)\n return Fixed.fromDecimalString(text, decimals)\n }\n\n toZeroHexInit() {\n return new ZeroHexFixedInit(this.toZeroHexString(), this.decimals)\n }\n\n toBigIntInit() {\n return new BigIntFixedInit(this.value, this.decimals)\n }\n\n toZeroHexString() {\n return ZeroHexString.fromBigInt(this.value)\n }\n\n toDecimalString() {\n const raw = this.value.toString().padStart(this.decimals, \"0\")\n\n const whole = raw.slice(0, raw.length - this.decimals).replaceAll(\"0\", \" \").trimStart().replaceAll(\" \", \"0\")\n const decimal = raw.slice(raw.length - this.decimals).replaceAll(\"0\", \" \").trimEnd().replaceAll(\" \", \"0\")\n\n if (!decimal)\n return (whole || \"0\")\n\n return `${whole || \"0\"}.${decimal}`\n }\n\n toString() {\n return this.toDecimalString()\n }\n\n toJSON() {\n return this.toZeroHexInit()\n }\n\n as(decimals: number) {\n return new Fixed(this.value, decimals)\n }\n\n move(decimals: number) {\n if (this.decimals > decimals)\n return new Fixed(this.value / BigInts.tensOf(this.decimals - decimals), decimals)\n if (this.decimals < decimals)\n return new Fixed(this.value * BigInts.tensOf(decimals - this.decimals), decimals)\n return this\n }\n\n add(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = Math.max(dx, dy)\n const tr = BigInts.tensOf(dr)\n\n const tx = this.tens\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * (tr / tx)) + (vy * (tr / ty)), dr)\n }\n\n sub(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = Math.max(dx, dy)\n const tr = BigInts.tensOf(dr)\n\n const tx = this.tens\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * (tr / tx)) - (vy * (tr / ty)), dr)\n }\n\n mul(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = dx + dy\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed(vx * vy, dr)\n }\n\n div(other: Fixed) {\n const dx = this.decimals\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * ty) / vy, dx)\n }\n\n floor() {\n return new Fixed(this.value - (this.value % this.tens), this.decimals)\n }\n\n ceil() {\n return new Fixed(this.value + (this.tens - (this.value % this.tens)), this.decimals)\n }\n\n round() {\n return new Fixed(this.value + (this.tens / 2n) - ((this.value + (this.tens / 2n)) % this.tens), this.decimals)\n }\n\n}\n"],"names":["ZeroHexFixedInit","constructor","decimals","value","BigIntFixedInit","Fixed","tens","BigInts","tensOf","unit","from","init","fromZeroHexString","fromZeroHexInit","fromBigIntInit","ZeroHexString","toBigInt","fromDecimalString","text","whole","decimal","split","BigInt","padEnd","slice","fromString","String","is","toZeroHexInit","toZeroHexString","toBigIntInit","fromBigInt","toDecimalString","raw","toString","padStart","length","replaceAll","trimStart","trimEnd","toJSON","as","move","add","other","dx","dy","dr","Math","max","tr","tx","ty","vx","vy","sub","mul","div","floor","ceil","round"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/libs/bigint/index.ts"],"sourcesContent":["\nexport namespace BigInts {\n\n export function tensOf(value: number) {\n return 10n ** BigInt(value)\n }\n\n}"],"names":["BigInts","tensOf","value","BigInt"],"mappings":";AACiBA,CAAAA,SAAAA,OAAAA,EAAAA;AAER,IAAA,SAASC,OAAOC,KAAa,EAAA;QAClC,OAAO,GAAG,IAAIC,MAAOD,CAAAA,KAAAA,CAAAA;AACvB;YAFgBD,MAAAA,GAAAA,MAAAA;AAIlB,CAAA,EANiBD,OAAAA,KAAAA,OAAAA,GAAAA,EAAAA,CAAAA,CAAAA;;;;"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { ZeroHexString } from '@hazae41/hex';
|
|
2
|
+
import { BigInts } from '../../libs/bigint/index.mjs';
|
|
3
|
+
|
|
4
|
+
class ZeroHexFixedInit {
|
|
5
|
+
value;
|
|
6
|
+
decimals;
|
|
7
|
+
constructor(value, decimals){
|
|
8
|
+
this.value = value;
|
|
9
|
+
this.decimals = decimals;
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
class BigIntFixedInit {
|
|
13
|
+
value;
|
|
14
|
+
decimals;
|
|
15
|
+
constructor(value, decimals){
|
|
16
|
+
this.value = value;
|
|
17
|
+
this.decimals = decimals;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
class Fixed {
|
|
21
|
+
value;
|
|
22
|
+
decimals;
|
|
23
|
+
tens;
|
|
24
|
+
constructor(value, decimals){
|
|
25
|
+
this.value = value;
|
|
26
|
+
this.decimals = decimals;
|
|
27
|
+
this.tens = BigInts.tensOf(decimals);
|
|
28
|
+
}
|
|
29
|
+
static unit(decimals) {
|
|
30
|
+
return new Fixed(BigInts.tensOf(decimals), decimals);
|
|
31
|
+
}
|
|
32
|
+
static from(init) {
|
|
33
|
+
if (init instanceof Fixed) return init;
|
|
34
|
+
if (typeof init.value === "string") return Fixed.fromZeroHexString(init.value, init.decimals);
|
|
35
|
+
return new Fixed(init.value, init.decimals);
|
|
36
|
+
}
|
|
37
|
+
static fromZeroHexInit(init) {
|
|
38
|
+
return Fixed.fromZeroHexString(init.value, init.decimals);
|
|
39
|
+
}
|
|
40
|
+
static fromBigIntInit(init) {
|
|
41
|
+
return new Fixed(init.value, init.decimals);
|
|
42
|
+
}
|
|
43
|
+
static fromZeroHexString(value, decimals) {
|
|
44
|
+
return new Fixed(ZeroHexString.toBigInt(value), decimals);
|
|
45
|
+
}
|
|
46
|
+
static fromDecimalString(text, decimals) {
|
|
47
|
+
const [whole = "0", decimal = "0"] = text.split(".");
|
|
48
|
+
const value = BigInt(whole + decimal.padEnd(decimals, "0").slice(0, decimals));
|
|
49
|
+
return new Fixed(value, decimals);
|
|
50
|
+
}
|
|
51
|
+
static fromString(text, decimals) {
|
|
52
|
+
if (ZeroHexString.String.is(text)) return Fixed.fromZeroHexString(text, decimals);
|
|
53
|
+
return Fixed.fromDecimalString(text, decimals);
|
|
54
|
+
}
|
|
55
|
+
toZeroHexInit() {
|
|
56
|
+
return new ZeroHexFixedInit(this.toZeroHexString(), this.decimals);
|
|
57
|
+
}
|
|
58
|
+
toBigIntInit() {
|
|
59
|
+
return new BigIntFixedInit(this.value, this.decimals);
|
|
60
|
+
}
|
|
61
|
+
toZeroHexString() {
|
|
62
|
+
return ZeroHexString.fromBigInt(this.value);
|
|
63
|
+
}
|
|
64
|
+
toDecimalString() {
|
|
65
|
+
const raw = this.value.toString().padStart(this.decimals, "0");
|
|
66
|
+
const whole = raw.slice(0, raw.length - this.decimals).replaceAll("0", " ").trimStart().replaceAll(" ", "0");
|
|
67
|
+
const decimal = raw.slice(raw.length - this.decimals).replaceAll("0", " ").trimEnd().replaceAll(" ", "0");
|
|
68
|
+
if (!decimal) return whole || "0";
|
|
69
|
+
return `${whole || "0"}.${decimal}`;
|
|
70
|
+
}
|
|
71
|
+
toString() {
|
|
72
|
+
return this.toDecimalString();
|
|
73
|
+
}
|
|
74
|
+
toJSON() {
|
|
75
|
+
return this.toZeroHexInit();
|
|
76
|
+
}
|
|
77
|
+
as(decimals) {
|
|
78
|
+
return new Fixed(this.value, decimals);
|
|
79
|
+
}
|
|
80
|
+
move(decimals) {
|
|
81
|
+
if (this.decimals > decimals) return new Fixed(this.value / BigInts.tensOf(this.decimals - decimals), decimals);
|
|
82
|
+
if (this.decimals < decimals) return new Fixed(this.value * BigInts.tensOf(decimals - this.decimals), decimals);
|
|
83
|
+
return this;
|
|
84
|
+
}
|
|
85
|
+
add(other) {
|
|
86
|
+
const dx = this.decimals;
|
|
87
|
+
const dy = other.decimals;
|
|
88
|
+
const dr = Math.max(dx, dy);
|
|
89
|
+
const tr = BigInts.tensOf(dr);
|
|
90
|
+
const tx = this.tens;
|
|
91
|
+
const ty = other.tens;
|
|
92
|
+
const vx = this.value;
|
|
93
|
+
const vy = other.value;
|
|
94
|
+
return new Fixed(vx * (tr / tx) + vy * (tr / ty), dr);
|
|
95
|
+
}
|
|
96
|
+
sub(other) {
|
|
97
|
+
const dx = this.decimals;
|
|
98
|
+
const dy = other.decimals;
|
|
99
|
+
const dr = Math.max(dx, dy);
|
|
100
|
+
const tr = BigInts.tensOf(dr);
|
|
101
|
+
const tx = this.tens;
|
|
102
|
+
const ty = other.tens;
|
|
103
|
+
const vx = this.value;
|
|
104
|
+
const vy = other.value;
|
|
105
|
+
return new Fixed(vx * (tr / tx) - vy * (tr / ty), dr);
|
|
106
|
+
}
|
|
107
|
+
mul(other) {
|
|
108
|
+
const dx = this.decimals;
|
|
109
|
+
const dy = other.decimals;
|
|
110
|
+
const dr = dx + dy;
|
|
111
|
+
const vx = this.value;
|
|
112
|
+
const vy = other.value;
|
|
113
|
+
return new Fixed(vx * vy, dr);
|
|
114
|
+
}
|
|
115
|
+
div(other) {
|
|
116
|
+
const dx = this.decimals;
|
|
117
|
+
const ty = other.tens;
|
|
118
|
+
const vx = this.value;
|
|
119
|
+
const vy = other.value;
|
|
120
|
+
return new Fixed(vx * ty / vy, dx);
|
|
121
|
+
}
|
|
122
|
+
floor() {
|
|
123
|
+
return new Fixed(this.value - this.value % this.tens, this.decimals);
|
|
124
|
+
}
|
|
125
|
+
ceil() {
|
|
126
|
+
return new Fixed(this.value + (this.tens - this.value % this.tens), this.decimals);
|
|
127
|
+
}
|
|
128
|
+
round() {
|
|
129
|
+
return new Fixed(this.value + this.tens / 2n - (this.value + this.tens / 2n) % this.tens, this.decimals);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
export { BigIntFixedInit, Fixed, ZeroHexFixedInit };
|
|
134
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../src/mods/fixed/index.ts"],"sourcesContent":["import { ZeroHexString } from \"@hazae41/hex\"\nimport { BigInts } from \"libs/bigint/index.js\"\n\nexport interface ZeroHexFixedInit<D extends number = number> {\n readonly value: ZeroHexString,\n readonly decimals: D\n}\n\nexport class ZeroHexFixedInit<D extends number = number> {\n\n constructor(\n readonly value: ZeroHexString,\n readonly decimals: D\n ) { }\n\n}\n\nexport interface BigIntFixedInit<D extends number = number> {\n readonly value: bigint,\n readonly decimals: D\n}\n\nexport class BigIntFixedInit<D extends number = number> {\n\n constructor(\n readonly value: bigint,\n readonly decimals: D\n ) { }\n\n}\n\nexport namespace Fixed {\n\n export type From<D extends number = number> =\n | BigIntFixedInit<D>\n | ZeroHexFixedInit<D>\n\n}\n\nexport class Fixed<D extends number = number> implements BigIntFixedInit {\n\n readonly tens: bigint\n\n constructor(\n readonly value: bigint,\n readonly decimals: D\n ) {\n this.tens = BigInts.tensOf(decimals)\n }\n\n static unit<D extends number = number>(decimals: D) {\n return new Fixed(BigInts.tensOf(decimals), decimals)\n }\n\n static from<D extends number = number>(init: Fixed.From<D>) {\n if (init instanceof Fixed)\n return init\n if (typeof init.value === \"string\")\n return Fixed.fromZeroHexString(init.value, init.decimals)\n return new Fixed(init.value, init.decimals)\n }\n\n static fromZeroHexInit<D extends number>(init: ZeroHexFixedInit<D>) {\n return Fixed.fromZeroHexString(init.value, init.decimals)\n }\n\n static fromBigIntInit<D extends number>(init: BigIntFixedInit<D>) {\n return new Fixed(init.value, init.decimals)\n }\n\n static fromZeroHexString<D extends number>(value: ZeroHexString, decimals: D) {\n return new Fixed(ZeroHexString.toBigInt(value), decimals)\n }\n\n static fromDecimalString<D extends number>(text: string, decimals: D) {\n const [whole = \"0\", decimal = \"0\"] = text.split(\".\")\n\n const value = BigInt(whole + decimal.padEnd(decimals, \"0\").slice(0, decimals))\n\n return new Fixed(value, decimals)\n }\n\n static fromString<D extends number>(text: string, decimals: D) {\n if (ZeroHexString.String.is(text))\n return Fixed.fromZeroHexString(text, decimals)\n return Fixed.fromDecimalString(text, decimals)\n }\n\n toZeroHexInit() {\n return new ZeroHexFixedInit(this.toZeroHexString(), this.decimals)\n }\n\n toBigIntInit() {\n return new BigIntFixedInit(this.value, this.decimals)\n }\n\n toZeroHexString() {\n return ZeroHexString.fromBigInt(this.value)\n }\n\n toDecimalString() {\n const raw = this.value.toString().padStart(this.decimals, \"0\")\n\n const whole = raw.slice(0, raw.length - this.decimals).replaceAll(\"0\", \" \").trimStart().replaceAll(\" \", \"0\")\n const decimal = raw.slice(raw.length - this.decimals).replaceAll(\"0\", \" \").trimEnd().replaceAll(\" \", \"0\")\n\n if (!decimal)\n return (whole || \"0\")\n\n return `${whole || \"0\"}.${decimal}`\n }\n\n toString() {\n return this.toDecimalString()\n }\n\n toJSON() {\n return this.toZeroHexInit()\n }\n\n as(decimals: number) {\n return new Fixed(this.value, decimals)\n }\n\n move(decimals: number) {\n if (this.decimals > decimals)\n return new Fixed(this.value / BigInts.tensOf(this.decimals - decimals), decimals)\n if (this.decimals < decimals)\n return new Fixed(this.value * BigInts.tensOf(decimals - this.decimals), decimals)\n return this\n }\n\n add(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = Math.max(dx, dy)\n const tr = BigInts.tensOf(dr)\n\n const tx = this.tens\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * (tr / tx)) + (vy * (tr / ty)), dr)\n }\n\n sub(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = Math.max(dx, dy)\n const tr = BigInts.tensOf(dr)\n\n const tx = this.tens\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * (tr / tx)) - (vy * (tr / ty)), dr)\n }\n\n mul(other: Fixed) {\n const dx = this.decimals\n const dy = other.decimals\n\n const dr = dx + dy\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed(vx * vy, dr)\n }\n\n div(other: Fixed) {\n const dx = this.decimals\n const ty = other.tens\n\n const vx = this.value\n const vy = other.value\n\n return new Fixed((vx * ty) / vy, dx)\n }\n\n floor() {\n return new Fixed(this.value - (this.value % this.tens), this.decimals)\n }\n\n ceil() {\n return new Fixed(this.value + (this.tens - (this.value % this.tens)), this.decimals)\n }\n\n round() {\n return new Fixed(this.value + (this.tens / 2n) - ((this.value + (this.tens / 2n)) % this.tens), this.decimals)\n }\n\n}\n"],"names":["ZeroHexFixedInit","constructor","decimals","value","BigIntFixedInit","Fixed","tens","BigInts","tensOf","unit","from","init","fromZeroHexString","fromZeroHexInit","fromBigIntInit","ZeroHexString","toBigInt","fromDecimalString","text","whole","decimal","split","BigInt","padEnd","slice","fromString","String","is","toZeroHexInit","toZeroHexString","toBigIntInit","fromBigInt","toDecimalString","raw","toString","padStart","length","replaceAll","trimStart","trimEnd","toJSON","as","move","add","other","dx","dy","dr","Math","max","tr","tx","ty","vx","vy","sub","mul","div","floor","ceil","round"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export { BigIntFixedInit, Fixed, ZeroHexFixedInit } from './mods/fixed/index.js';
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { ZeroHexString } from '@hazae41/hex';
|
|
2
|
+
|
|
3
|
+
interface ZeroHexFixedInit<D extends number = number> {
|
|
4
|
+
readonly value: ZeroHexString;
|
|
5
|
+
readonly decimals: D;
|
|
6
|
+
}
|
|
7
|
+
declare class ZeroHexFixedInit<D extends number = number> {
|
|
8
|
+
readonly value: ZeroHexString;
|
|
9
|
+
readonly decimals: D;
|
|
10
|
+
constructor(value: ZeroHexString, decimals: D);
|
|
11
|
+
}
|
|
12
|
+
interface BigIntFixedInit<D extends number = number> {
|
|
13
|
+
readonly value: bigint;
|
|
14
|
+
readonly decimals: D;
|
|
15
|
+
}
|
|
16
|
+
declare class BigIntFixedInit<D extends number = number> {
|
|
17
|
+
readonly value: bigint;
|
|
18
|
+
readonly decimals: D;
|
|
19
|
+
constructor(value: bigint, decimals: D);
|
|
20
|
+
}
|
|
21
|
+
declare namespace Fixed {
|
|
22
|
+
type From<D extends number = number> = BigIntFixedInit<D> | ZeroHexFixedInit<D>;
|
|
23
|
+
}
|
|
24
|
+
declare class Fixed<D extends number = number> implements BigIntFixedInit {
|
|
25
|
+
readonly value: bigint;
|
|
26
|
+
readonly decimals: D;
|
|
27
|
+
readonly tens: bigint;
|
|
28
|
+
constructor(value: bigint, decimals: D);
|
|
29
|
+
static unit<D extends number = number>(decimals: D): Fixed<D>;
|
|
30
|
+
static from<D extends number = number>(init: Fixed.From<D>): Fixed<any>;
|
|
31
|
+
static fromZeroHexInit<D extends number>(init: ZeroHexFixedInit<D>): Fixed<D>;
|
|
32
|
+
static fromBigIntInit<D extends number>(init: BigIntFixedInit<D>): Fixed<D>;
|
|
33
|
+
static fromZeroHexString<D extends number>(value: ZeroHexString, decimals: D): Fixed<D>;
|
|
34
|
+
static fromDecimalString<D extends number>(text: string, decimals: D): Fixed<D>;
|
|
35
|
+
static fromString<D extends number>(text: string, decimals: D): Fixed<D>;
|
|
36
|
+
toZeroHexInit(): ZeroHexFixedInit<D>;
|
|
37
|
+
toBigIntInit(): BigIntFixedInit<D>;
|
|
38
|
+
toZeroHexString(): `0x${string}` & {
|
|
39
|
+
readonly [Symbol.isZeroHex]: true;
|
|
40
|
+
};
|
|
41
|
+
toDecimalString(): string;
|
|
42
|
+
toString(): string;
|
|
43
|
+
toJSON(): ZeroHexFixedInit<D>;
|
|
44
|
+
as(decimals: number): Fixed<number>;
|
|
45
|
+
move(decimals: number): Fixed<number>;
|
|
46
|
+
add(other: Fixed): Fixed<number>;
|
|
47
|
+
sub(other: Fixed): Fixed<number>;
|
|
48
|
+
mul(other: Fixed): Fixed<number>;
|
|
49
|
+
div(other: Fixed): Fixed<D>;
|
|
50
|
+
floor(): Fixed<D>;
|
|
51
|
+
ceil(): Fixed<D>;
|
|
52
|
+
round(): Fixed<D>;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
export { BigIntFixedInit, Fixed, ZeroHexFixedInit };
|
package/package.json
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
{
|
|
2
|
+
"type": "module",
|
|
3
|
+
"name": "@hazae41/fixed",
|
|
4
|
+
"version": "1.0.0",
|
|
5
|
+
"description": "Fixed-point numbers in idiomatic TypeScript",
|
|
6
|
+
"homepage": "https://github.com/hazae41/fixed",
|
|
7
|
+
"repository": "github:hazae41/fixed",
|
|
8
|
+
"author": "hazae41",
|
|
9
|
+
"license": "MIT",
|
|
10
|
+
"main": "./dist/cjs/index.cjs",
|
|
11
|
+
"module": "./dist/esm/index.mjs",
|
|
12
|
+
"types": "./dist/types/index.d.ts",
|
|
13
|
+
"sideEffects": false,
|
|
14
|
+
"files": [
|
|
15
|
+
"./dist/esm",
|
|
16
|
+
"./dist/cjs",
|
|
17
|
+
"./dist/types"
|
|
18
|
+
],
|
|
19
|
+
"scripts": {
|
|
20
|
+
"build": "rimraf dist && rollup -c",
|
|
21
|
+
"test": "node ./dist/test/index.test.mjs",
|
|
22
|
+
"prepare": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"devDependencies": {
|
|
25
|
+
"@hazae41/phobos": "^1.0.10",
|
|
26
|
+
"@hazae41/rimraf": "^1.0.1",
|
|
27
|
+
"@types/node": "^22.14.1",
|
|
28
|
+
"@types/react": "^19.1.2",
|
|
29
|
+
"rollup": "^4.40.0",
|
|
30
|
+
"rollup-plugin-dts": "^6.2.1",
|
|
31
|
+
"rollup-plugin-node-externals": "^8.0.0",
|
|
32
|
+
"rollup-plugin-swc3": "^0.12.1"
|
|
33
|
+
},
|
|
34
|
+
"exports": {
|
|
35
|
+
".": {
|
|
36
|
+
"types": "./dist/types/index.d.ts",
|
|
37
|
+
"import": "./dist/esm/index.mjs",
|
|
38
|
+
"require": "./dist/cjs/index.cjs"
|
|
39
|
+
}
|
|
40
|
+
},
|
|
41
|
+
"keywords": [
|
|
42
|
+
"typescript",
|
|
43
|
+
"esmodules",
|
|
44
|
+
"tested",
|
|
45
|
+
"unit-tested"
|
|
46
|
+
],
|
|
47
|
+
"dependencies": {
|
|
48
|
+
"@hazae41/hex": "^1.0.1"
|
|
49
|
+
}
|
|
50
|
+
}
|