UNPKG

@coderspirit/nominal-inputs

Version:

Extension of @coderspirit/nominal with 'input' types

64 lines (60 loc) 3.29 kB
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 };