Skip to content

Instantly share code, notes, and snippets.

@sina-salahshour
Last active August 18, 2024 22:53
Show Gist options
  • Select an option

  • Save sina-salahshour/b389bb8c45ca49953f393b32ad71922e to your computer and use it in GitHub Desktop.

Select an option

Save sina-salahshour/b389bb8c45ca49953f393b32ad71922e to your computer and use it in GitHub Desktop.
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