Skip to content

Instantly share code, notes, and snippets.

@PetarKirov
Created January 14, 2024 22:24
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save PetarKirov/33404cbdc66ca5aaa192881e10ff5214 to your computer and use it in GitHub Desktop.
Save PetarKirov/33404cbdc66ca5aaa192881e10ff5214 to your computer and use it in GitHub Desktop.
TypeScript type-level Peano arithmetic
type Zero = [];
type NN = number[];
type GetNN<N extends NN> = N['length'];
type NextNN<N extends NN> = [...N, N['length']];
type PrevNN<N extends NN> = N extends [...infer Init, infer _] ? Init : never;
type EqualNN<A extends NN, B extends NN> =
GetNN<A> extends GetNN<B> ? true : false;
type Make<N extends number, Base extends NN = Zero> =
N extends GetNN<Base> ? Base : Make<N, NextNN<Base>>;
type AddNN<A extends NN, B extends NN> = B extends Zero
? A
: B extends NextNN<infer Prev>
? NextNN<AddNN<A, Prev>>
: never;
type MultiplyNN<A extends NN, B extends NN> = B extends Zero
? Zero
: B extends NextNN<infer Prev>
? AddNN<A, MultiplyNN<A, Prev>>
: B;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment