<
S extends object,
const Keys extends ReadonlyArray<keyof S>,
L extends Lambda
>(
keys: Keys,
lambda: L
): (self: S) => {
[K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>
}
<
S extends object,
const Keys extends ReadonlyArray<keyof S>,
L extends Lambda
>(
self: S,
keys: Keys,
lambda: L
): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]> }Applies a Lambda transformation to all keys except the specified ones; the excluded keys are copied unchanged.
When to use
Use when most keys should be transformed but a few should be preserved.
Example (Wrapping all values except one in arrays)
import { pipe, Struct } from "effect"
interface AsArray extends Struct.Lambda {
<A>(self: A): Array<A>
readonly "~lambda.out": Array<this["~lambda.in"]>
}
const asArray = Struct.lambda<AsArray>((a) => [a])
const result = pipe(
{ x: 1, y: 2, z: 3 },
Struct.mapOmit(["y"], asArray)
)
console.log(result) // { x: [1], y: 2, z: [3] }export const const mapOmit: {
<
S extends object,
Keys extends ReadonlyArray<keyof S>,
L extends Lambda
>(
keys: Keys,
lambda: L
): (self: S) => {
[K in keyof S]: K extends Keys[number]
? S[K]
: Apply<L, S[K]>
}
<
S extends object,
Keys extends ReadonlyArray<keyof S>,
L extends Lambda
>(
self: S,
keys: Keys,
lambda: L
): {
[K in keyof S]: K extends Keys[number]
? S[K]
: Apply<L, S[K]>
}
}
Applies a
Lambda
transformation to all keys except the specified
ones; the excluded keys are copied unchanged.
When to use
Use when most keys should be transformed but a few should be preserved.
Example (Wrapping all values except one in arrays)
import { pipe, Struct } from "effect"
interface AsArray extends Struct.Lambda {
<A>(self: A): Array<A>
readonly "~lambda.out": Array<this["~lambda.in"]>
}
const asArray = Struct.lambda<AsArray>((a) => [a])
const result = pipe(
{ x: 1, y: 2, z: 3 },
Struct.mapOmit(["y"], asArray)
)
console.log(result) // { x: [1], y: 2, z: [3] }
mapOmit: {
<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S extends object, const function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S>, function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L extends Lambda>(
keys: const Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys,
lambda: L extends Lambdalambda: function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L
): (
self: S extends objectself: function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S
) => { [function (type parameter) KK in keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S]: function (type parameter) KK extends function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys[number] ? function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S[function (type parameter) KK] : type Apply<L extends Lambda, V> = (L & {
readonly "~lambda.in": V
})["~lambda.out"]
Applies a
Lambda
type-level function to a value type V, producing
the output type.
When to use
Use when you need to compute what type a Lambda would produce for a
given input.
Details
This works by intersecting the Lambda with { "~lambda.in": V } and reading
"~lambda.out".
Example (Computing the output type of a lambda)
import type { Struct } from "effect"
interface ToString extends Struct.Lambda {
readonly "~lambda.out": string
}
// Result is `string`
type Result = Struct.Apply<ToString, number>
Apply<function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L, function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(keys: Keys, lambda: L): (self: S) => { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S[function (type parameter) KK]> }
<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S extends object, const function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S>, function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L extends Lambda>(
self: S extends objectself: function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S,
keys: const Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys,
lambda: L extends Lambdalambda: function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L
): { [function (type parameter) KK in keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S]: function (type parameter) KK extends function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }Keys[number] ? function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S[function (type parameter) KK] : type Apply<L extends Lambda, V> = (L & {
readonly "~lambda.in": V
})["~lambda.out"]
Applies a
Lambda
type-level function to a value type V, producing
the output type.
When to use
Use when you need to compute what type a Lambda would produce for a
given input.
Details
This works by intersecting the Lambda with { "~lambda.in": V } and reading
"~lambda.out".
Example (Computing the output type of a lambda)
import type { Struct } from "effect"
interface ToString extends Struct.Lambda {
readonly "~lambda.out": string
}
// Result is `string`
type Result = Struct.Apply<ToString, number>
Apply<function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }L, function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Lambda>(self: S, keys: Keys, lambda: L): { [K in keyof S]: K extends Keys[number] ? S[K] : Apply<L, S[K]>; }S[function (type parameter) KK]> }
} = import dualdual(
3,
<function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyS extends object, const function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyKeys extends interface ReadonlyArray<T>ReadonlyArray<keyof function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyS>, function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyL extends Function>(
self: S extends objectself: function (type parameter) S in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyS,
keys: const Keys extends ReadonlyArray<keyof S>keys: function (type parameter) Keys in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyKeys,
lambda: L extends Functionlambda: function (type parameter) L in <S extends object, const Keys extends ReadonlyArray<keyof S>, L extends Function>(self: S, keys: Keys, lambda: L): anyL
) => {
return function buildStruct<S, (k: keyof S, v: S[keyof S]) => [keyof S, any]>(source: S, f: (k: keyof S, v: S[keyof S]) => [keyof S, any]): anyWalk source; for each key decide what to emit via the small callback.
The callback returns either
• undefined → nothing is copied, or
• [newKey, newVal]
so every public API just supplies a different callback.
buildStruct(self: S extends objectself, (k: keyof Sk, v: S[keyof S]v) => [k: keyof Sk, !keys: const Keys extends ReadonlyArray<keyof S>keys.ReadonlyArray<keyof S>.includes(searchElement: keyof S, fromIndex?: number): booleanDetermines whether an array includes a certain element, returning true or false as appropriate.
includes(k: keyof Sk) ? lambda: L extends Functionlambda(v: S[keyof S]v) : v: S[keyof S]v])
}
)