brand-music
Version:
Strongly typed music theory library
20 lines (15 loc) • 788 B
text/typescript
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 };