<S extends object, const K extends keyof S>(key: K): (self: S) => S[K]
<S extends object, const K extends keyof S>(self: S, key: K): S[K]Retrieves the value at key from a struct.
When to use
Use to extract a single property from a struct in a pipeline.
Details
The return type is narrowed to S[K].
Example (Extracting a property in a pipeline)
import { pipe, Struct } from "effect"
const name = pipe({ name: "Alice", age: 30 }, Struct.get("name"))
console.log(name) // "Alice"export const const get: {
<S extends object, const K extends keyof S>(
key: K
): (self: S) => S[K]
<S extends object, const K extends keyof S>(
self: S,
key: K
): S[K]
}
Retrieves the value at key from a struct.
When to use
Use to extract a single property from a struct in a pipeline.
Details
The return type is narrowed to S[K].
Example (Extracting a property in a pipeline)
import { pipe, Struct } from "effect"
const name = pipe({ name: "Alice", age: 30 }, Struct.get("name"))
console.log(name) // "Alice"
get: {
<function (type parameter) S in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]S extends object, const function (type parameter) K in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]K extends keyof function (type parameter) S in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]S>(key: const K extends keyof Skey: function (type parameter) K in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]K): (self: S extends objectself: function (type parameter) S in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]S) => function (type parameter) S in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]S[function (type parameter) K in <S extends object, const K extends keyof S>(key: K): (self: S) => S[K]K]
<function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S extends object, const function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K extends keyof function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S>(self: S extends objectself: function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S, key: const K extends keyof Skey: function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K): function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S[function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K]
} = dual<(...args: Array<any>) => any, <S extends object, const K extends keyof S>(self: S, key: K) => S[K]>(arity: 2, body: <S extends object, const K extends keyof S>(self: S, key: K) => S[K]): ((...args: Array<any>) => any) & (<S extends object, const K extends keyof S>(self: S, key: K) => S[K]) (+1 overload)Creates a function that can be called in data-first style or data-last
(pipe-friendly) style.
When to use
Use to expose one implementation through both direct and pipe-friendly
call styles.
Details
Pass either the arity of the uncurried function or a predicate that decides
whether the current call is data-first. Arity is the common case. Use a
predicate when optional arguments make arity ambiguous.
Example (Selecting data-first or data-last style by arity)
import { Function, pipe } from "effect"
const sum = Function.dual<
(that: number) => (self: number) => number,
(self: number, that: number) => number
>(2, (self, that) => self + that)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
Example (Defining overloads with call signatures)
import { Function, pipe } from "effect"
const sum: {
(that: number): (self: number) => number
(self: number, that: number): number
} = Function.dual(2, (self: number, that: number): number => self + that)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
Example (Selecting data-first or data-last style with a predicate)
import { Function, pipe } from "effect"
const sum = Function.dual<
(that: number) => (self: number) => number,
(self: number, that: number) => number
>(
(args) => args.length === 2,
(self, that) => self + that
)
console.log(sum(2, 3)) // 5
console.log(pipe(2, sum(3))) // 5
dual(2, <function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S extends object, const function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K extends keyof function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S>(self: S extends objectself: function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S, key: const K extends keyof Skey: function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K): function (type parameter) S in <S extends object, const K extends keyof S>(self: S, key: K): S[K]S[function (type parameter) K in <S extends object, const K extends keyof S>(self: S, key: K): S[K]K] => self: S extends objectself[key: const K extends keyof Skey])