import type { IsEqualTo } from "../Utils/index.js"; export declare const CaseBrand: unique symbol; export interface CaseBrand { [CaseBrand]: string[]; } export declare function hasCaseBrand(self: unknown): self is CaseBrand; export interface Copy { copy(args: IsEqualTo extends true ? void : Partial): this; } export interface CaseConstructor { readonly make: (this: X, ...args: X extends new (...args: infer R) => any ? R : never) => X extends new (...args: any) => any ? InstanceType : never; new (args: IsEqualTo extends true ? void : T): T & Copy; } export declare const caseArgs: unique symbol; export declare const caseKeys: unique symbol; export declare const Case: CaseConstructor; export interface CaseConstructorTagged { readonly _tag: Tag; readonly make: , "new">>(this: X, ...args: X extends new (...args: infer R) => any ? R : never) => X extends new (...args: any[]) => any ? InstanceType : never; new (args: IsEqualTo extends true ? void : T): T & Copy & { readonly [k in K]: Tag; }; } export interface CaseConstructorADT { readonly _tag: Tag; readonly make: , "new">>(this: X, ...args: X extends new (...args: infer R) => any ? R : never) => X extends new (...args: any) => any ? InstanceType extends Y ? Y : InstanceType : Y; new (args: IsEqualTo extends true ? void : T): T & Copy & { readonly [k in K]: Tag; }; } export declare function TaggedADT(): { (tag: Tag): CaseConstructorADT; (tag: Tag, key: Key): CaseConstructorADT; }; export declare function Tagged(tag: Tag, key: Key): CaseConstructorTagged; export declare function Tagged(tag: Tag): CaseConstructorTagged; //# sourceMappingURL=index.d.ts.map