interface IntBrand {
    readonly Int: unique symbol;
}
type Int = number & IntBrand;

type Negate<N extends number> = N extends 0 ? 0 : `${N}` extends `-${infer X extends number}` ? X : `-${N}` extends `${infer X extends number}` ? X : number;
type RangedNat<START extends number, END extends number, ARR extends unknown[] = [], ACC extends number = never> = ARR["length"] extends END ? ACC | START | END : RangedNat<START, END, [
    ...ARR,
    1
], ARR[START] extends undefined ? ACC : ACC | ARR["length"]>;

interface NonNegativeBrand {
    readonly NonNegative: unique symbol;
}
type NonNegative = number & NonNegativeBrand;

type NonNegativeInt = Int & NonNegative;

export type { Int as I, NonNegativeInt as N, RangedNat as R, IntBrand as a, Negate as b, NonNegativeBrand as c };
