export type Nat = Zero | { _prev: Nat } export type Zero = { _prev: null } export type Succ = { _prev: N } export type Pred = N extends Zero ? Zero : N['_prev'] export type Add = A extends Zero ? B : Add, Succ> export type ToNumber = N extends Zero ? Acc['length'] : ToNumber, [...Acc, 0]> export type FromNumber< N extends number, Res extends Nat = Zero, Acc extends 0[] = [] > = N extends Acc['length'] ? Res : FromNumber, [...Acc, 0]> export type _0 = Zero export type _1 = Succ<_0> export type _2 = Succ<_1> export type _3 = Succ<_2> export type _4 = Succ<_3> export type _5 = Succ<_4> export type _9 = Add<_4, _5>