UNPKG

brand-music

Version:

Strongly typed music theory library

20 lines (15 loc) 788 B
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 };