Last active
August 18, 2024 22:53
-
-
Save sina-salahshour/b389bb8c45ca49953f393b32ad71922e to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| type Unshift<X, Arr extends unknown[]> = [X, ...Arr]; | |
| type Push<X, Arr extends unknown[]> = [...Arr, X]; | |
| type Tail<X> = X extends [infer _Head, ...infer Res] ? Res : never; | |
| type Head<X> = X extends [infer Res, ...infer _Tail] ? Res : never; | |
| type Reverse<X extends unknown[]> = X extends [] ? [] : X extends [infer Head, ...infer Tail] ? Push<Head, Reverse<Tail>> : []; | |
| type DigitAdd<A extends string, B extends string> = | |
| A extends "0" ? [false, B] : | |
| A extends "1" ? | |
| B extends "0" ? [false, "1"] : | |
| B extends "1" ? [false, "2"] : | |
| B extends "2" ? [false, "3"] : | |
| B extends "3" ? [false, "4"] : | |
| B extends "4" ? [false, "5"] : | |
| B extends "5" ? [false, "6"] : | |
| B extends "6" ? [false, "7"] : | |
| B extends "7" ? [false, "8"] : | |
| B extends "8" ? [false, "9"] : | |
| B extends "9" ? [true, "0"] : never : | |
| A extends "2" ? | |
| B extends "0" ? [false, "2"] : | |
| B extends "1" ? [false, "3"] : | |
| B extends "2" ? [false, "4"] : | |
| B extends "3" ? [false, "5"] : | |
| B extends "4" ? [false, "6"] : | |
| B extends "5" ? [false, "7"] : | |
| B extends "6" ? [false, "8"] : | |
| B extends "7" ? [false, "9"] : | |
| B extends "8" ? [true, "0"] : | |
| B extends "9" ? [true, "1"] : never : | |
| A extends "3" ? | |
| B extends "0" ? [false, "3"] : | |
| B extends "1" ? [false, "4"] : | |
| B extends "2" ? [false, "5"] : | |
| B extends "3" ? [false, "6"] : | |
| B extends "4" ? [false, "7"] : | |
| B extends "5" ? [false, "8"] : | |
| B extends "6" ? [false, "9"] : | |
| B extends "7" ? [true, "0"] : | |
| B extends "8" ? [true, "1"] : | |
| B extends "9" ? [true, "2"] : never : | |
| A extends "4" ? | |
| B extends "0" ? [false, "4"] : | |
| B extends "1" ? [false, "5"] : | |
| B extends "2" ? [false, "6"] : | |
| B extends "3" ? [false, "7"] : | |
| B extends "4" ? [false, "8"] : | |
| B extends "5" ? [false, "9"] : | |
| B extends "6" ? [true, "0"] : | |
| B extends "7" ? [true, "1"] : | |
| B extends "8" ? [true, "2"] : | |
| B extends "9" ? [true, "3"] : never : | |
| A extends "5" ? | |
| B extends "0" ? [false, "5"] : | |
| B extends "1" ? [false, "6"] : | |
| B extends "2" ? [false, "7"] : | |
| B extends "3" ? [false, "8"] : | |
| B extends "4" ? [false, "9"] : | |
| B extends "5" ? [true, "0"] : | |
| B extends "6" ? [true, "1"] : | |
| B extends "7" ? [true, "2"] : | |
| B extends "8" ? [true, "3"] : | |
| B extends "9" ? [true, "4"] : never : | |
| A extends "6" ? | |
| B extends "0" ? [false, "6"] : | |
| B extends "1" ? [false, "7"] : | |
| B extends "2" ? [false, "8"] : | |
| B extends "3" ? [false, "9"] : | |
| B extends "4" ? [true, "0"] : | |
| B extends "5" ? [true, "1"] : | |
| B extends "6" ? [true, "2"] : | |
| B extends "7" ? [true, "3"] : | |
| B extends "8" ? [true, "4"] : | |
| B extends "9" ? [true, "5"] : never : | |
| A extends "7" ? | |
| B extends "0" ? [false, "7"] : | |
| B extends "1" ? [false, "8"] : | |
| B extends "2" ? [false, "9"] : | |
| B extends "3" ? [true, "0"] : | |
| B extends "4" ? [true, "1"] : | |
| B extends "5" ? [true, "2"] : | |
| B extends "6" ? [true, "3"] : | |
| B extends "7" ? [true, "4"] : | |
| B extends "8" ? [true, "5"] : | |
| B extends "9" ? [true, "6"] : never : | |
| A extends "8" ? | |
| B extends "0" ? [false, "8"] : | |
| B extends "1" ? [false, "9"] : | |
| B extends "2" ? [true, "0"] : | |
| B extends "3" ? [true, "1"] : | |
| B extends "4" ? [true, "2"] : | |
| B extends "5" ? [true, "3"] : | |
| B extends "6" ? [true, "4"] : | |
| B extends "7" ? [true, "5"] : | |
| B extends "8" ? [true, "6"] : | |
| B extends "9" ? [true, "7"] : never : | |
| A extends "9" ? | |
| B extends "0" ? [false, "9"] : | |
| B extends "1" ? [true, "0"] : | |
| B extends "2" ? [true, "1"] : | |
| B extends "3" ? [true, "2"] : | |
| B extends "4" ? [true, "3"] : | |
| B extends "5" ? [true, "4"] : | |
| B extends "6" ? [true, "5"] : | |
| B extends "7" ? [true, "6"] : | |
| B extends "8" ? [true, "7"] : | |
| B extends "9" ? [true, "8"] : never | |
| : never | |
| type LogicalOr<A extends boolean, B extends boolean> = A extends true ? A : B; | |
| type DigitAddCarry<A extends string, B extends string, C extends boolean> = | |
| DigitAdd<A, B> extends [infer Carry, infer Res] ? Carry extends boolean ? Res extends string ? C extends false ? [Carry, Res] : DigitAdd<Res, "1"> extends [infer Carry2, infer Res2] ? Carry2 extends boolean ? [LogicalOr<Carry, Carry2>, Res2] : never : never : never : never : never; | |
| type StringToList<S> = S extends `${infer Head}${infer Tail}` ? [Head, ...StringToList<Tail>] : []; | |
| type ListToString<L> = L extends [infer Head, ...infer Tail] ? Head extends string ? `${Head}${ListToString<Tail>}` : "" : ""; | |
| type AddResult = [boolean, string]; | |
| type ReversedListAdd<A extends Array<string>, B extends Array<string>, Carry extends boolean = false> = | |
| A extends [] ? | |
| B extends [] ? | |
| Carry extends true ? ["1"] : [] | |
| : ReversedListAdd<["0"], B, Carry> | |
| : B extends [] ? ReversedListAdd<A, ["0"], Carry> | |
| : DigitAddCarry<Head<A>, Head<B>, Carry> extends infer R ? R extends AddResult ? [R[1], ...ReversedListAdd<Tail<A>, Tail<B>, R[0]>] : never : never; | |
| type StringAdd<A extends string, B extends String> = ListToString<Reverse<ReversedListAdd<Reverse<StringToList<A>>, Reverse<StringToList<B>>>>> | |
| type res = StringAdd<"64", "48"> |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment