/** * @since 1.0.0 */ import * as Equal from "@effect/data/Equal"; import * as Hash from "@effect/data/Hash"; import type * as Types from "@effect/data/Types"; /** * @category models * @since 1.0.0 */ export type Data> | ReadonlyArray> = Readonly & Equal.Equal; /** * `Case` represents a datatype similar to a case class in Scala. Namely, a * datatype created using `Case` will, by default, provide an implementation * for a constructor, `Hash`, and `Equal`. * * @since 1.0.0 * @category models */ export interface Case extends Equal.Equal { } /** * @since 1.0.0 */ export declare namespace Case { /** * @since 1.0.0 * @category models */ interface Constructor { (args: Omit extends Record ? void : Omit): A; } } /** * @category constructors * @since 1.0.0 */ export declare const struct: >>(as: As) => Data; /** * @category constructors * @since 1.0.0 */ export declare const unsafeStruct: >>(as: As) => Data; /** * @category constructors * @since 1.0.0 */ export declare const tuple: (...as: As) => Data; /** * @category constructors * @since 1.0.0 */ export declare const array: (as: As) => Data; /** * @category constructors * @since 1.0.0 */ export declare const unsafeArray: (as: As) => Data; declare const _case: () => Case.Constructor; export { /** * Provides a constructor for the specified `Case`. * * @since 1.0.0 * @category constructors */ _case as case }; /** * Provides a tagged constructor for the specified `Case`. * * @since 1.0.0 * @category constructors */ export declare const tagged: (tag: A["_tag"]) => Case.Constructor; /** * Provides a Tagged constructor for a Case Class. * * @since 1.0.0 * @category constructors */ export declare const TaggedClass: (tag: Key) => new >(args: Types.Equals, {}> extends true ? void : Omit) => Data; /** * @since 1.0.0 * @category constructors */ export declare class Structural { constructor(args: Omit); /** * @since 1.0.0 */ [Hash.symbol](this: Equal.Equal): number; /** * @since 1.0.0 */ [Equal.symbol](this: Equal.Equal, that: Equal.Equal): boolean; } /** * Provides a constructor for a Case Class. * * @since 1.0.0 * @category constructors */ export declare const Class: new >(args: Types.Equals, {}> extends true ? void : Omit) => Data; /** * Create a tagged enum data type, which is a union of `Data` structs. * * ```ts * import * as Data from "@effect/data/Data" * * type HttpError = Data.TaggedEnum<{ * BadRequest: { status: 400, message: string } * NotFound: { status: 404, message: string } * }> * * // Equivalent to: * type HttpErrorPlain = * | Data.Data<{ * readonly _tag: "BadRequest" * readonly status: 400 * readonly message: string * }> * | Data.Data<{ * readonly _tag: "NotFound" * readonly status: 404 * readonly message: string * }> * ``` * * @since 1.0.0 * @category models */ export type TaggedEnum>> = { readonly [Tag in keyof A]: Data>>; }[keyof A]; /** * @since 1.0.0 */ export declare namespace TaggedEnum { /** * @since 1.0.0 * @category models */ interface WithGenerics { readonly taggedEnum: Data<{ readonly _tag: string; }>; readonly numberOfGenerics: Count; readonly A: unknown; readonly B: unknown; readonly C: unknown; readonly D: unknown; } /** * @since 1.0.0 * @category models */ type Kind, A = unknown, B = unknown, C = unknown, D = unknown> = (Z & { readonly A: A; readonly B: B; readonly C: C; readonly D: D; })["taggedEnum"]; /** * @since 1.0.0 */ type Args, K extends A["_tag"]> = Omit, "_tag" | keyof Case> extends infer T ? {} extends T ? void : T : never; /** * @since 1.0.0 */ type Value, K extends A["_tag"]> = Extract; } /** * Create a constructor for a tagged union of `Data` structs. * * You can also pass a `TaggedEnum.WithGenerics` if you want to add generics to * the constructor. * * @example * import * as Data from "@effect/data/Data" * * const HttpError = Data.taggedEnum< * | Data.Data<{ _tag: "BadRequest"; status: 400; message: string }> * | Data.Data<{ _tag: "NotFound"; status: 404; message: string }> * >() * * const notFound = HttpError("NotFound")({ status: 404, message: "Not Found" }) * * @example * import * as Data from "@effect/data/Data" * * type MyResult = Data.TaggedEnum<{ * Failure: { error: E } * Success: { value: A } * }> * interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> { * readonly taggedEnum: MyResult * } * const MyResult = Data.taggedEnum() * * const success = MyResult("Success")({ value: 1 }) * * @category constructors * @since 1.0.0 */ export declare const taggedEnum: { >(): (tag: K) => (args: TaggedEnum.Args, K>) => TaggedEnum.Value, K>; >(): (tag: K) => (args: TaggedEnum.Args, K>) => TaggedEnum.Value, K>; >(): (tag: K) => (args: TaggedEnum.Args, K>) => TaggedEnum.Value, K>; >(): (tag: K) => (args: TaggedEnum.Args, K>) => TaggedEnum.Value, K>; >(): (tag: K) => Case.Constructor, "_tag">; }; //# sourceMappingURL=Data.d.ts.map