/**
* @since 2.0.0
*/
import type * as Cause from "./Cause.js";
import type * as Types from "./Types.js";
import type { Unify } from "./Unify.js";
/**
* @since 2.0.0
*/
export declare namespace Case {
/**
* @since 2.0.0
* @category models
*/
interface Constructor {
(args: Types.VoidIfEmpty<{
readonly [P in keyof A as P extends Tag ? never : P]: A[P];
}>): A;
}
}
/**
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* const alice = Data.struct({ name: "Alice", age: 30 })
*
* const bob = Data.struct({ name: "Bob", age: 40 })
*
* assert.deepStrictEqual(Equal.equals(alice, alice), true)
* assert.deepStrictEqual(Equal.equals(alice, Data.struct({ name: "Alice", age: 30 })), true)
*
* assert.deepStrictEqual(Equal.equals(alice, { name: "Alice", age: 30 }), false)
* assert.deepStrictEqual(Equal.equals(alice, bob), false)
* ```
*
* @category constructors
* @since 2.0.0
*/
export declare const struct: >(a: A) => {
readonly [P in keyof A]: A[P];
};
/**
* @category constructors
* @since 2.0.0
*/
export declare const unsafeStruct: >(as: A) => { readonly [P in keyof A]: A[P]; };
/**
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* const alice = Data.tuple("Alice", 30)
*
* const bob = Data.tuple("Bob", 40)
*
* assert.deepStrictEqual(Equal.equals(alice, alice), true)
* assert.deepStrictEqual(Equal.equals(alice, Data.tuple("Alice", 30)), true)
*
* assert.deepStrictEqual(Equal.equals(alice, ["Alice", 30]), false)
* assert.deepStrictEqual(Equal.equals(alice, bob), false)
* ```
*
* @category constructors
* @since 2.0.0
*/
export declare const tuple: >(...as: As) => Readonly;
/**
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* const alice = Data.struct({ name: "Alice", age: 30 })
* const bob = Data.struct({ name: "Bob", age: 40 })
*
* const persons = Data.array([alice, bob])
*
* assert.deepStrictEqual(
* Equal.equals(
* persons,
* Data.array([
* Data.struct({ name: "Alice", age: 30 }),
* Data.struct({ name: "Bob", age: 40 })
* ])
* ),
* true
* )
* ```
*
* @category constructors
* @since 2.0.0
*/
export declare const array: >(as: As) => Readonly;
/**
* @category constructors
* @since 2.0.0
*/
export declare const unsafeArray: >(as: As) => Readonly;
declare const _case: () => Case.Constructor;
export {
/**
* Provides a constructor for the specified `Case`.
*
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* interface Person {
* readonly name: string
* }
*
* // Creating a constructor for the specified Case
* const Person = Data.case()
*
* // Creating instances of Person
* const mike1 = Person({ name: "Mike" })
* const mike2 = Person({ name: "Mike" })
* const john = Person({ name: "John" })
*
* // Checking equality
* assert.deepStrictEqual(Equal.equals(mike1, mike2), true)
* assert.deepStrictEqual(Equal.equals(mike1, john), false)
*
* ```
* @since 2.0.0
* @category constructors
*/
_case as case };
/**
* Provides a tagged constructor for the specified `Case`.
*
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data } from "effect"
*
* interface Person {
* readonly _tag: "Person" // the tag
* readonly name: string
* }
*
* const Person = Data.tagged("Person")
*
* const mike = Person({ name: "Mike" })
*
* assert.deepEqual(mike, { _tag: "Person", name: "Mike" })
* ```
*
* @since 2.0.0
* @category constructors
*/
export declare const tagged: (tag: A["_tag"]) => Case.Constructor;
/**
* Provides a constructor for a Case Class.
*
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* class Person extends Data.Class<{ readonly name: string }> {}
*
* // Creating instances of Person
* const mike1 = new Person({ name: "Mike" })
* const mike2 = new Person({ name: "Mike" })
* const john = new Person({ name: "John" })
*
* // Checking equality
* assert.deepStrictEqual(Equal.equals(mike1, mike2), true)
* assert.deepStrictEqual(Equal.equals(mike1, john), false)
* ```
*
* @since 2.0.0
* @category constructors
*/
export declare const Class: new = {}>(args: Types.VoidIfEmpty<{
readonly [P in keyof A]: A[P];
}>) => Readonly;
/**
* Provides a Tagged constructor for a Case Class.
*
* @example
* ```ts
* import * as assert from "node:assert"
* import { Data, Equal } from "effect"
*
* class Person extends Data.TaggedClass("Person")<{ readonly name: string }> {}
*
* // Creating instances of Person
* const mike1 = new Person({ name: "Mike" })
* const mike2 = new Person({ name: "Mike" })
* const john = new Person({ name: "John" })
*
* // Checking equality
* assert.deepStrictEqual(Equal.equals(mike1, mike2), true)
* assert.deepStrictEqual(Equal.equals(mike1, john), false)
*
* assert.deepStrictEqual(mike1._tag, "Person")
* ```
*
* @since 2.0.0
* @category constructors
*/
export declare const TaggedClass: (tag: Tag) => new = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Readonly & {
readonly _tag: Tag;
};
/**
* @since 2.0.0
* @category constructors
*/
export declare const Structural: new (args: Types.VoidIfEmpty<{
readonly [P in keyof A]: A[P];
}>) => {};
/**
* Create a tagged enum data type, which is a union of `Data` structs.
*
* ```ts
* import * as assert from "node:assert"
* import { Data } from "effect"
*
* type HttpError = Data.TaggedEnum<{
* BadRequest: { readonly status: 400, readonly message: string }
* NotFound: { readonly status: 404, readonly message: string }
* }>
*
* // Equivalent to:
* type HttpErrorPlain =
* | {
* readonly _tag: "BadRequest"
* readonly status: 400
* readonly message: string
* }
* | {
* readonly _tag: "NotFound"
* readonly status: 404
* readonly message: string
* }
* ```
*
* @since 2.0.0
* @category models
*/
export type TaggedEnum> & UntaggedChildren> = keyof A extends infer Tag ? Tag extends keyof A ? Types.Simplify<{
readonly _tag: Tag;
} & {
readonly [K in keyof A[Tag]]: A[Tag][K];
}> : never : never;
type ChildrenAreTagged = keyof A extends infer K ? K extends keyof A ? "_tag" extends keyof A[K] ? true : false : never : never;
type UntaggedChildren = true extends ChildrenAreTagged ? "It looks like you're trying to create a tagged enum, but one or more of its members already has a `_tag` property." : unknown;
/**
* @since 2.0.0
*/
export declare namespace TaggedEnum {
/**
* @since 2.0.0
* @category models
*/
interface WithGenerics {
readonly taggedEnum: {
readonly _tag: string;
};
readonly numberOfGenerics: Count;
readonly A: unknown;
readonly B: unknown;
readonly C: unknown;
readonly D: unknown;
}
/**
* @since 2.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 2.0.0
*/
type Args> = {
readonly [K in keyof E as K extends "_tag" ? never : K]: E[K];
} extends infer T ? Types.VoidIfEmpty : never;
/**
* @since 2.0.0
*/
type Value = Extract;
/**
* @since 3.1.0
*/
type Constructor = Types.Simplify<{
readonly [Tag in A["_tag"]]: Case.Constructor, "_tag">;
} & {
readonly $is: (tag: Tag) => (u: unknown) => u is Extract;
readonly $match: {
) => any;
}>(cases: Cases & {
[K in Exclude]: never;
}): (value: A) => Unify>;
) => any;
}>(value: A, cases: Cases & {
[K in Exclude]: never;
}): Unify>;
};
}>;
/**
* @since 3.2.0
*/
interface GenericMatchers> {
readonly $is: (tag: Tag) => {
>(u: T): u is T & {
readonly _tag: Tag;
};
(u: unknown): u is Extract, {
readonly _tag: Tag;
}>;
};
readonly $match: {
, {
readonly _tag: Tag;
}>) => any;
}>(cases: Cases & {
[K in Exclude]: never;
}): (self: TaggedEnum.Kind) => Unify>;
, {
readonly _tag: Tag;
}>) => any;
}>(self: TaggedEnum.Kind, cases: Cases & {
[K in Exclude]: never;
}): Unify>;
};
}
}
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
export declare const taggedEnum: {
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: TaggedEnum.Args, Tag, Extract, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value, Tag>;
} & TaggedEnum.GenericMatchers>;
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: TaggedEnum.Args, Tag, Extract, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value, Tag>;
} & TaggedEnum.GenericMatchers>;
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: TaggedEnum.Args, Tag, Extract, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value, Tag>;
} & TaggedEnum.GenericMatchers>;
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
>(): Types.Simplify<{
readonly [Tag in Z["taggedEnum"]["_tag"]]: (args: TaggedEnum.Args, Tag, Extract, {
readonly _tag: Tag;
}>>) => TaggedEnum.Value, Tag>;
} & TaggedEnum.GenericMatchers>;
/**
* 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
* ```ts
* import { Data } from "effect"
*
* const { BadRequest, NotFound } = Data.taggedEnum<
* | { readonly _tag: "BadRequest"; readonly status: 400; readonly message: string }
* | { readonly _tag: "NotFound"; readonly status: 404; readonly message: string }
* >()
*
* const notFound = NotFound({ status: 404, message: "Not Found" })
* ```
*
* @example
* import { Data } from "effect"
*
* type MyResult = Data.TaggedEnum<{
* Failure: { readonly error: E }
* Success: { readonly value: A }
* }>
* interface MyResultDefinition extends Data.TaggedEnum.WithGenerics<2> {
* readonly taggedEnum: MyResult
* }
* const { Failure, Success } = Data.taggedEnum()
*
* const success = Success({ value: 1 })
*
* @category constructors
* @since 2.0.0
*/
(): TaggedEnum.Constructor;
};
/**
* Provides a constructor for a Case Class.
*
* @since 2.0.0
* @category constructors
*/
export declare const Error: new = {}>(args: Types.VoidIfEmpty<{
readonly [P in keyof A]: A[P];
}>) => Cause.YieldableError & Readonly;
/**
* @since 2.0.0
* @category constructors
*/
export declare const TaggedError: (tag: Tag) => new = {}>(args: Types.VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P]; }>) => Cause.YieldableError & {
readonly _tag: Tag;
} & Readonly;
//# sourceMappingURL=Data.d.ts.map