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