Compare commits
No commits in common. "main" and "adding-subtraction" have entirely different histories.
main
...
adding-sub
27
README.md
27
README.md
|
|
@ -1,27 +0,0 @@
|
|||
# Math Types
|
||||
|
||||
A typescript library that aims to provide performant arithmetic types.
|
||||
|
||||
# Limitations
|
||||
|
||||
Currently math-types does not support negative numbers, decimals, or bigints.
|
||||
|
||||
# Types
|
||||
|
||||
### Add<A extends number, B extends number>
|
||||
|
||||
Resolves to the sum of A and B
|
||||
The corresponding function `add` uses this type
|
||||
|
||||
### Max<A extends number, B extends number>
|
||||
|
||||
Resolves to the larger of A and B
|
||||
The corresponding function `max` uses this type
|
||||
|
||||
# Current Roadmap
|
||||
|
||||
- Subtraction
|
||||
- Support negative numbers
|
||||
- Support decimal numbers
|
||||
- Multiplication
|
||||
- Division
|
||||
3
index.ts
3
index.ts
|
|
@ -1,3 +0,0 @@
|
|||
export * from './src/Addition'
|
||||
export * from './src/Max'
|
||||
export * from './src/Digits'
|
||||
|
|
@ -1,15 +1,14 @@
|
|||
{
|
||||
"name": "math-types",
|
||||
"version": "0.0.2",
|
||||
"name": "numeric-types",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "Jeff Lieb",
|
||||
"license": "NON-AI ISC",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"typescript": "^5.3.3"
|
||||
},
|
||||
"keywords": ["typescript", "math", "add", "max"]
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -1,4 +1,4 @@
|
|||
import { DigitsToNumber, SplitDigits, Digit, TupleForDigit } from "./Digits";
|
||||
import { DigitsToNumber, SplitDigits, Digit, TupleForDigit } from ".";
|
||||
|
||||
|
||||
export type Add<A extends number, B extends number> = DigitsToNumber<AddDigitArrays<SplitDigits<A>, SplitDigits<B>>> & number
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
|
||||
import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from "./Digits"
|
||||
import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from "."
|
||||
|
||||
export type Max<A extends number, B extends number> = DigitsToNumber<MaxDigitArray<SplitDigits<A>, SplitDigits<B>>> & number
|
||||
|
||||
|
|
|
|||
|
|
@ -0,0 +1,15 @@
|
|||
import { Digit, DigitsToNumber, SplitDigits, TupleForDigit } from ".";
|
||||
|
||||
export type Add<A extends number, B extends number> = DigitsToNumber<SubtractDigitArrays<SplitDigits<A>, SplitDigits<B>>> & number
|
||||
|
||||
type SubtractDigitArrays<A extends Digit[], B extends Digit[], Carry extends boolean = false> =
|
||||
[A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], [...infer HeadB extends Digit[], infer TailB extends Digit]] ? AddTails<HeadA, TailA, HeadB, TailB, Carry> : [A, B] extends [[...infer HeadA extends Digit[], infer TailA extends Digit], []] ? AddTails<HeadA, TailA, [], 0, Carry> : [A, B] extends [[], [...infer HeadB extends Digit[], infer TailB extends Digit]] ? AddTails<[], 0, HeadB, TailB, Carry> : [A, B] extends [[], []] ? Carry extends true ? [1] : [] : []
|
||||
|
||||
type SubtractTails<HeadA extends Digit[], TailA extends Digit, HeadB extends Digit[], TailB extends Digit, Carry extends boolean> =
|
||||
SplitDigits<SubtractDigits<TailA, TailB, Carry>> extends [1, infer Result extends Digit] ? [...AddDigitArrays<HeadA, HeadB, true>, Result] : [...AddDigitArrays<HeadA, HeadB>, SplitDigits<AddDigits<TailA, TailB, Carry>>[0]]
|
||||
|
||||
type SubtractDigits<A extends Digit, B extends Digit, Carry extends boolean = false> =
|
||||
|
||||
[...TupleForDigit<A>, ...TupleForDigit<B>, ...(Carry extends false ? [] : [0])]['length'] & number
|
||||
|
||||
|
||||
|
|
@ -1,4 +1,6 @@
|
|||
export type Digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|
||||
type NonZeroDigit = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
|
||||
export type Digit = 0 | NonZeroDigit
|
||||
type Tuple0To9 = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
|
||||
|
||||
export type TupleForDigit<Value extends Digit> =
|
||||
Value extends 0 ? []
|
||||
|
|
@ -25,6 +27,8 @@ type TakeDigitFromString<DigitString extends String> =
|
|||
? [Head, ...TakeDigitFromString<Tail>]
|
||||
: never
|
||||
|
||||
type Zeros<Length extends number> = [] & {length: Length} extends [...infer Tuple] ? {[Property in keyof Tuple]: 0} & Array<0> & {length: Length} : never
|
||||
|
||||
type StringToNumber<NumericString extends string> = NumericString extends `${infer Number extends number}` ? Number : never
|
||||
|
||||
type Stringable = string | number | bigint | boolean | null | undefined
|
||||
Loading…
Reference in New Issue