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