UNPKG

veffect

Version:

powerful TypeScript validation library built on the robust foundation of Effect combining exceptional type safety, high performance, and developer experience. Taking inspiration from Effect's functional principles, VEffect delivers a balanced approach tha

119 lines (103 loc) 2.65 kB
/** * @since 2.0.0 */ import { identity } from "./Function.js" /** * @since 2.0.0 */ export declare const unifySymbol: unique symbol /** * @since 2.0.0 */ export type unifySymbol = typeof unifySymbol /** * @since 2.0.0 */ export declare const typeSymbol: unique symbol /** * @since 2.0.0 */ export type typeSymbol = typeof typeSymbol /** * @since 2.0.0 */ export declare const ignoreSymbol: unique symbol /** * @since 2.0.0 */ export type ignoreSymbol = typeof ignoreSymbol type MaybeReturn<F> = F extends () => any ? ReturnType<F> : F type Values<X extends [any, any]> = X extends any ? { [k in keyof X[0]]-?: k extends X[1] ? never : MaybeReturn<X[0][k]> }[keyof X[0]] : never type Ignore<X> = X extends { [ignoreSymbol]?: any } ? keyof NonNullable<X[ignoreSymbol]> : never type ExtractTypes< X extends { [typeSymbol]?: any [unifySymbol]?: any } > = X extends any ? [ NonNullable<X[unifySymbol]>, Ignore<X> ] : never type FilterIn<A> = A extends any ? typeSymbol extends keyof A ? A : never : never type FilterOut<A> = A extends any ? typeSymbol extends keyof A ? never : A : never /** * @since 2.0.0 */ export type Unify<A> = Values< ExtractTypes< ( & FilterIn<A> & { [typeSymbol]: A } ) > > extends infer Z ? Z | Exclude<A, Z> | FilterOut<A> : never /** * @since 2.0.0 */ export const unify: { < Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T >( x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T ): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T> < Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T >( x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T ): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T> < Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T >( x: (...args: Args) => (...args: Args2) => (...args: Args3) => T ): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T> < Args extends Array<any>, Args2 extends Array<any>, T >( x: (...args: Args) => (...args: Args2) => T ): (...args: Args) => (...args: Args2) => Unify<T> < Args extends Array<any>, T >(x: (...args: Args) => T): (...args: Args) => Unify<T> <T>(x: T): Unify<T> } = identity as any