/** * @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 extends () => infer R ? R : NonNullable type Values = X extends [infer A, infer Ignore] ? Exclude extends infer k ? k extends keyof A ? MaybeReturn : never : never : never type Ignore = X extends { [ignoreSymbol]?: infer Obj } ? keyof NonNullable : never type ExtractTypes< X > = X extends { [typeSymbol]?: infer _Type [unifySymbol]?: infer _Unify } ? [NonNullable<_Unify>, Ignore] : 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 2.0.0 */ export type Unify = Values< ExtractTypes< ( & FilterIn & { [typeSymbol]: A } ) > > extends infer Z ? Z | Exclude | FilterOut : never /** * @since 2.0.0 */ export const unify: { /** * @since 2.0.0 */ < 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 /** * @since 2.0.0 */ < 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 /** * @since 2.0.0 */ < 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 /** * @since 2.0.0 */ < Args extends Array, Args2 extends Array, T >(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify /** * @since 2.0.0 */ < Args extends Array, T >(x: (...args: Args) => T): (...args: Args) => Unify /** * @since 2.0.0 */ (x: T): Unify } = identity as any