<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
Args4 extends Array<any>,
Args5 extends Array<any>,
T
>(
x: (
...args: Args
) => (
...args: Args2
) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T
): (
...args: Args
) => (
...args: Args2
) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>
<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
Args4 extends Array<any>,
T
>(
x: (
...args: Args
) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T
): (
...args: Args
) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>
<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
T
>(
x: (...args: Args) => (...args: Args2) => (...args: Args3) => T
): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>
<Args extends Array<any>, Args2 extends Array<any>, T>(
x: (...args: Args) => (...args: Args2) => T
): (...args: Args) => (...args: Args2) => Unify<T>
<Args extends Array<any>, T>(x: (...args: Args) => T): (
...args: Args
) => Unify<T>
<T>(x: T): Unify<T>Applies Unify to a value or function return type at compile time.
When to use
Use to keep a value or function unchanged at runtime while normalizing its inferred type with Effect's unification protocol.
Details
This is an identity function at runtime. For functions, the returned function has the same runtime behavior while its return type is normalized with the Effect unification protocol.
Example (Unifying values and function results)
import { Unify } from "effect"
// Unify a simple value
const unifiedValue = Unify.unify("hello")
// Type: string
// Unify a function result
const createUnifiableValue = () => ({
value: "test",
[Unify.typeSymbol]: "string" as const,
[Unify.unifySymbol]: { String: () => "test" as const }
})
const unifiedFunction = Unify.unify(createUnifiableValue)
// The result will be properly unified
// Unify with curried functions
const curriedFunction = (a: string) => (b: number) => ({ result: a + b })
const unifiedCurried = Unify.unify(curriedFunction)
// Type: (a: string) => (b: number) => Unify<{ result: string }>export const const unify: {
<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
Args4 extends Array<any>,
Args5 extends Array<any>,
T
>(
x: (
...args: Args
) => (
...args: Args2
) => (
...args: Args3
) => (...args: Args4) => (...args: Args5) => T
): (
...args: Args
) => (
...args: Args2
) => (
...args: Args3
) => (
...args: Args4
) => (...args: Args5) => Unify<T>
<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
Args4 extends Array<any>,
T
>(
x: (
...args: Args
) => (
...args: Args2
) => (...args: Args3) => (...args: Args4) => T
): (
...args: Args
) => (
...args: Args2
) => (
...args: Args3
) => (...args: Args4) => Unify<T>
<
Args extends Array<any>,
Args2 extends Array<any>,
Args3 extends Array<any>,
T
>(
x: (
...args: Args
) => (...args: Args2) => (...args: Args3) => T
): (
...args: Args
) => (
...args: Args2
) => (...args: Args3) => Unify<T>
<
Args extends Array<any>,
Args2 extends Array<any>,
T
>(
x: (...args: Args) => (...args: Args2) => T
): (
...args: Args
) => (...args: Args2) => Unify<T>
<Args extends Array<any>, T>(
x: (...args: Args) => T
): (...args: Args) => Unify<T>
<T>(x: T): Unify<T>
}
Applies Unify to a value or function return type at compile time.
When to use
Use to keep a value or function unchanged at runtime while normalizing its
inferred type with Effect's unification protocol.
Details
This is an identity function at runtime. For functions, the returned function
has the same runtime behavior while its return type is normalized with the
Effect unification protocol.
Example (Unifying values and function results)
import { Unify } from "effect"
// Unify a simple value
const unifiedValue = Unify.unify("hello")
// Type: string
// Unify a function result
const createUnifiableValue = () => ({
value: "test",
[Unify.typeSymbol]: "string" as const,
[Unify.unifySymbol]: { String: () => "test" as const }
})
const unifiedFunction = Unify.unify(createUnifiableValue)
// The result will be properly unified
// Unify with curried functions
const curriedFunction = (a: string) => (b: number) => ({ result: a + b })
const unifiedCurried = Unify.unify(curriedFunction)
// Type: (a: string) => (b: number) => Unify<{ result: string }>
unify: {
<
function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args extends interface Array<T>Array<any>,
function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args2 extends interface Array<T>Array<any>,
function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args3 extends interface Array<T>Array<any>,
function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args4 extends interface Array<T>Array<any>,
function (type parameter) Args5 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args5 extends interface Array<T>Array<any>,
function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>T
>(
x: (
...args: Args
) => (
...args: Args2
) => (
...args: Args3
) => (...args: Args4) => (...args: Args5) => T
x: (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args3) => (...args: Args4 extends Array<any>args: function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args4) => (...args: Args5 extends Array<any>args: function (type parameter) Args5 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args5) => function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>T
): (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args3) => (...args: Args4 extends Array<any>args: function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args4) => (...args: Args5 extends Array<any>args: function (type parameter) Args5 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>Args5) => type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, Args5 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => (...args: Args5) => Unify<T>T>
<
function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args extends interface Array<T>Array<any>,
function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args2 extends interface Array<T>Array<any>,
function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args3 extends interface Array<T>Array<any>,
function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args4 extends interface Array<T>Array<any>,
function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>T
>(
x: (
...args: Args
) => (
...args: Args2
) => (...args: Args3) => (...args: Args4) => T
x: (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args3) => (...args: Args4 extends Array<any>args: function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args4) => function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>T
): (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args3) => (...args: Args4 extends Array<any>args: function (type parameter) Args4 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>Args4) => type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, Args4 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => (...args: Args4) => Unify<T>T>
<
function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args extends interface Array<T>Array<any>,
function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args2 extends interface Array<T>Array<any>,
function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args3 extends interface Array<T>Array<any>,
function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>T
>(
x: (
...args: Args
) => (...args: Args2) => (...args: Args3) => T
x: (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args3) => function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>T
): (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args2) => (...args: Args3 extends Array<any>args: function (type parameter) Args3 in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>Args3) => type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, Args3 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => (...args: Args3) => T): (...args: Args) => (...args: Args2) => (...args: Args3) => Unify<T>T>
<
function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args extends interface Array<T>Array<any>,
function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args2 extends interface Array<T>Array<any>,
function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>T
>(
x: (...args: Args) => (...args: Args2) => Tx: (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args2) => function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>T
): (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args) => (...args: Args2 extends Array<any>args: function (type parameter) Args2 in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>Args2) => type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <Args extends Array<any>, Args2 extends Array<any>, T>(x: (...args: Args) => (...args: Args2) => T): (...args: Args) => (...args: Args2) => Unify<T>T>
<
function (type parameter) Args in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>Args extends interface Array<T>Array<any>,
function (type parameter) T in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>T
>(x: (...args: Args) => Tx: (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>Args) => function (type parameter) T in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>T): (...args: Args extends Array<any>args: function (type parameter) Args in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>Args) => type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <Args extends Array<any>, T>(x: (...args: Args) => T): (...args: Args) => Unify<T>T>
<function (type parameter) T in <T>(x: T): Unify<T>T>(x: Tx: function (type parameter) T in <T>(x: T): Unify<T>T): type Unify<A> = Values<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
> extends infer Z
?
| Z
| FilterInUnmatched<
A,
Keys<
ExtractTypes<
FilterIn<A> & {
[typeSymbol]: A
}
>
>
>
| FilterOut<A>
: never
Unifies types that implement the unification protocol.
When to use
Use to normalize unions of types that expose Effect's unification protocol.
Details
This type performs automatic type unification for types that contain
the unification symbols (unifySymbol, typeSymbol, ignoreSymbol).
It's primarily used internally by the Effect type system to handle
complex type unions and provide better type inference.
Example (Unifying protocol types)
import type { Unify } from "effect"
// Example of types that can be unified
type UnifiableA = {
value: string
[Unify.typeSymbol]?: string
[Unify.unifySymbol]?: { String: () => string }
}
type UnifiableB = {
value: number
[Unify.typeSymbol]?: number
[Unify.unifySymbol]?: { Number: () => number }
}
// Unify automatically handles the union
type Unified = Unify.Unify<UnifiableA | UnifiableB>
// Results in a properly unified type
Unify<function (type parameter) T in <T>(x: T): Unify<T>T>
} = import identityidentity as any