@coderspirit/nominal-inputs
Version:
Extension of @coderspirit/nominal with 'input' types
64 lines (60 loc) • 3.29 kB
text/typescript
import { FastProperty } from '@coderspirit/nominal';
/**
* Copied from https://gist.github.com/sno2/7dac868ec6d11abb75250ce5e2b36041
* @author Carter Snook <cartersnook04@gmail.com> github.com/sno2
* @license https://unlicense.org/
*/
type TCache = [string, 0[]];
type StringLengthUp<T extends string, $Acc extends 0[] = [], $Cache extends TCache[] = [[`$${string}`, [0]]]> = $Cache extends [
infer C extends TCache,
...infer $RestCache extends TCache[]
] ? (`${C[0]}${C[0]}_` extends `$${string}$${infer $After}` ? `${C[0]}${$After}` extends `${infer $Before}_` ? $Before : never : never) extends infer $DoubleC extends string ? `$${T}` extends `${$DoubleC}${infer $Rest}` ? StringLengthUp<$Rest, [
...$Acc,
...C[1],
...C[1]
], [
[$DoubleC, [...C[1], ...C[1]]],
...$Cache
]> : `$${T}` extends `${C[0]}${infer $Rest}` ? StringLengthUp<$Rest, [...$Acc, ...C[1]], $Cache> : StringLengthDown<T, $Acc, $RestCache> : never : $Acc['length'];
type StringLengthDown<T extends string, $Acc extends 0[], $Cache extends TCache[]> = $Cache extends [
infer C extends TCache,
...infer $RestCache extends TCache[]
] ? `$${T}` extends `${C[0]}${infer $Rest}` ? StringLengthDown<$Rest, [...$Acc, ...C[1]], $Cache> : StringLengthDown<T, $Acc, $RestCache> : $Acc['length'];
type StringLength<S extends string> = S extends '' ? 0 : string extends S ? number : number extends S['length'] ? StringLengthUp<S> : S['length'];
type Numeric = number | bigint;
type Zero = 0 | 0n;
type TaggedInteger<N extends Numeric = number> = FastProperty<N, {
Fractional: false;
}>;
type TaggedPositive<N extends Numeric = number> = FastProperty<N, {
Sign: '+';
}>;
type TaggedNegative<N extends Numeric = number> = FastProperty<N, {
Sign: '-';
}>;
type TaggedPositiveInteger<N extends Numeric = number> = FastProperty<N, {
Fractional: false;
Sign: '+';
}>;
type TaggedNegativeInteger<N extends Numeric = number> = FastProperty<N, {
Fractional: false;
Sign: '-';
}>;
type TaggedFloat<N extends number = number> = FastProperty<N, {
Fractional: true;
}>;
type TaggedPositiveFloat<N extends number = number> = FastProperty<N, {
Fractional: true;
Sign: '+';
}>;
type TaggedNegativeFloat<N extends number = number> = FastProperty<N, {
Fractional: true;
Sign: '-';
}>;
type IntegerInput<N extends Numeric = number> = N extends TaggedInteger<infer _NN> ? N : `${N}` extends `${bigint}` ? N : never;
type PositiveInput<N extends Numeric> = N extends TaggedPositive<infer _NN> ? N : N extends Zero ? never : `${N}` extends `-${string}` ? never : N;
type NegativeInput<N extends Numeric> = N extends TaggedNegative<infer _NN> ? N : N extends Zero ? never : `${N}` extends `-${string}` ? N : never;
type PositiveIntegerInput<N extends Numeric = number> = PositiveInput<N> & IntegerInput<N>;
type NegativeIntegerInput<N extends Numeric = number> = NegativeInput<N> & IntegerInput<N>;
type SizedStringInput<T extends string, N extends number> = StringLength<T> extends N ? T : never;
export type { IntegerInput, NegativeInput, NegativeIntegerInput, PositiveInput, PositiveIntegerInput, SizedStringInput, TaggedFloat, TaggedInteger, TaggedNegative, TaggedNegativeFloat, TaggedNegativeInteger, TaggedPositive, TaggedPositiveFloat, TaggedPositiveInteger };