import { InferMatch, TagUnion, Pattern } from './match'; declare type Tags = ADT['tag']; export declare type Member> = InferMatch<'tag', ADT, Tag>; export declare type UntaggedMember> = Omit, 'tag'>; declare type As = { [Tag in Tags]: (args: UntaggedMember) => Member; }; declare type Of = { [Tag in Tags]: (args: UntaggedMember) => ADT; }; declare type Is = { [Tag in Tags]: (arg: ADT) => arg is Member; }; declare type Match = (pattern: Pattern<'tag', ADT, A>) => (adt: ADT) => A; export declare type TaggedUnionUtils = { as: As; of: Of; is: Is; match: Match; }; declare type TagTuple = { [S in U]: Exclude extends never ? [...R, S] : TagTuple, [...R, S]>; }[U]; declare type Flatten = { [K in keyof A]: A[K]; } & {}; export declare type TaggedUnion> = { [Tag in keyof A]: Flatten<{ tag: Tag; } & A[Tag]>; }[keyof A]; export declare const TaggedUnion: (tags: TagTuple, []>) => TaggedUnionUtils; export {};