Skip to content
Effect Days 2026 Get your ticket

Record

This module provides utility functions for working with records in TypeScript.

45 exports Added in v2.0.0 Source

Constructors

empty

Added in v2.0.0 Source

Creates a new, empty record.

Signature

declare function empty<K extends string | symbol = never, V = never>(): Record<ReadonlyRecord.NonLiteralKey<K>, V>

fromEntries

Added in v2.0.0 Source

Builds a record from an iterable of key-value pairs.

If there are conflicting keys when using fromEntries, the last occurrence of the key/value pair will overwrite the previous ones. So the resulting record will only have the value of the last occurrence of each key.

Signature

declare const fromEntries: <Entry extends readonly [string | symbol, any]>(entries: Iterable<Entry>) => Record<ReadonlyRecord.NonLiteralKey<Entry[0]>, Entry[1]>

Example

import * as assert from "node:assert"
import { fromEntries } from "effect/Record"
const input: Array<[string, number]> = [["a", 1], ["b", 2]]
assert.deepStrictEqual(fromEntries(input), { a: 1, b: 2 })

Creates a new record from an iterable, utilizing the provided function to determine the key for each element.

Signature

declare function fromIterableBy<A, K extends string | symbol>(items: Iterable<A>, f: (a: A) => K): Record<ReadonlyRecord.NonLiteralKey<K>, A>

Example

import * as assert from "node:assert"
import { fromIterableBy } from "effect/Record"
const users = [
{ id: "2", name: "name2" },
{ id: "1", name: "name1" }
]
assert.deepStrictEqual(
fromIterableBy(users, user => user.id),
{
"2": { id: "2", name: "name2" },
"1": { id: "1", name: "name1" }
}
)

Takes an iterable and a projection function and returns a record. The projection function maps each value of the iterable to a tuple of a key and a value, which is then added to the resulting record.

Signature

declare const fromIterableWith: {
<A, K extends string | symbol, B>(f: (a: A) => readonly [K, B]): (self: Iterable<A>) => Record<ReadonlyRecord.NonLiteralKey<K>, B>;
<A, K extends string | symbol, B>(self: Iterable<A>, f: (a: A) => readonly [K, B]): Record<ReadonlyRecord.NonLiteralKey<K>, B>;
}

Example

import * as assert from "node:assert"
import { fromIterableWith } from "effect/Record"
const input = [1, 2, 3, 4]
assert.deepStrictEqual(
fromIterableWith(input, a => [String(a), a * 2]),
{ '1': 2, '2': 4, '3': 6, '4': 8 }
)

singleton

Added in v2.0.0 Source

Create a non-empty record from a single element.

Signature

declare function singleton<K extends string | symbol, A>(key: K, value: A): Record<K, A>

Conversions

collect

Added in v2.0.0 Source

Transforms the values of a record into an Array with a custom mapping function.

Signature

declare const collect: {
<K extends string, A, B>(f: (key: K, a: A) => B): (self: ReadonlyRecord<K, A>) => Array<B>;
<K extends string, A, B>(self: ReadonlyRecord<K, A>, f: (key: K, a: A) => B): Array<B>;
}

Example

import * as assert from "node:assert"
import { collect } from "effect/Record"
const x = { a: 1, b: 2, c: 3 }
assert.deepStrictEqual(collect(x, (key, n) => [key, n]), [["a", 1], ["b", 2], ["c", 3]])

toEntries

Added in v2.0.0 Source

Takes a record and returns an array of tuples containing its keys and values.

Signature

declare const toEntries: <K extends string, A>(self: ReadonlyRecord<K, A>) => Array<[K, A]>

Example

import * as assert from "node:assert"
import { toEntries } from "effect/Record"
const x = { a: 1, b: 2, c: 3 }
assert.deepStrictEqual(toEntries(x), [["a", 1], ["b", 2], ["c", 3]])

Elements

findFirst

Added in v3.14.0 Source

Returns the first entry that satisfies the specified predicate, or None if no such entry exists.

Signature

declare const findFirst: {
<K extends string | symbol, V, V2>(refinement: (value: NoInfer<V>, key: NoInfer<K>) => value is V2): (self: ReadonlyRecord<K, V>) => Option<[K, V2]>;
<K extends string | symbol, V>(predicate: (value: NoInfer<V>, key: NoInfer<K>) => boolean): (self: ReadonlyRecord<K, V>) => Option<[K, V]>;
<K extends string | symbol, V, V2>(self: ReadonlyRecord<K, V>, refinement: (value: NoInfer<V>, key: NoInfer<K>) => value is V2): Option<[K, V2]>;
<K extends string | symbol, V>(self: ReadonlyRecord<K, V>, predicate: (value: NoInfer<V>, key: NoInfer<K>) => boolean): Option<[K, V]>;
}

Example

import { Record, Option } from "effect"
const record = { a: 1, b: 2, c: 3 }
const result = Record.findFirst(record, (value, key) => value > 1 && key !== "b")
console.log(result) // Option.Some(["c", 3])

Filtering

filter

Added in v2.0.0 Source

Selects properties from a record whose values match the given predicate.

Signature

declare const filter: {
<K extends string, A, B>(refinement: (a: NoInfer<A>, key: K) => a is B): (self: ReadonlyRecord<K, A>) => Record<ReadonlyRecord.NonLiteralKey<K>, B>;
<K extends string, A>(predicate: (A: NoInfer<A>, key: K) => boolean): (self: ReadonlyRecord<K, A>) => Record<ReadonlyRecord.NonLiteralKey<K>, A>;
<K extends string, A, B>(self: ReadonlyRecord<K, A>, refinement: (a: A, key: K) => a is B): Record<ReadonlyRecord.NonLiteralKey<K>, B>;
<K extends string, A>(self: ReadonlyRecord<K, A>, predicate: (a: A, key: K) => boolean): Record<ReadonlyRecord.NonLiteralKey<K>, A>;
}

Example

import * as assert from "node:assert"
import { filter } from "effect/Record"
const x = { a: 1, b: 2, c: 3, d: 4 }
assert.deepStrictEqual(filter(x, (n) => n > 2), { c: 3, d: 4 })

getLefts

Added in v2.0.0 Source

Given a record with Either values, returns a new record containing only the Left values, preserving the original keys.

Signature

declare function getLefts<K extends string, R, L>(self: ReadonlyRecord<K, Either<R, L>>): Record<ReadonlyRecord.NonLiteralKey<K>, L>

Example

import * as assert from "node:assert"
import { Record, Either } from "effect"
assert.deepStrictEqual(
Record.getLefts({ a: Either.right(1), b: Either.left("err"), c: Either.right(2) }),
{ b: "err" }
)

getRights

Added in v2.0.0 Source

Given a record with Either values, returns a new record containing only the Right values, preserving the original keys.

Signature

declare function getRights<K extends string, R, L>(self: ReadonlyRecord<K, Either<R, L>>): Record<string, R>

Example

import * as assert from "node:assert"
import { Record, Either } from "effect"
assert.deepStrictEqual(
Record.getRights({ a: Either.right(1), b: Either.left("err"), c: Either.right(2) }),
{ a: 1, c: 2 }
)

getSomes

Added in v2.0.0 Source

Given a record with Option values, returns a new record containing only the Some values, preserving the original keys.

Signature

declare const getSomes: <K extends string, A>(self: ReadonlyRecord<K, Option.Option<A>>) => Record<ReadonlyRecord.NonLiteralKey<K>, A>

Example

import * as assert from "node:assert"
import { Record, Option } from "effect"
assert.deepStrictEqual(
Record.getSomes({ a: Option.some(1), b: Option.none(), c: Option.some(2) }),
{ a: 1, c: 2 }
)

partition

Added in v2.0.0 Source

Partitions a record into two separate records based on the result of a predicate function.

Signature

declare const partition: {
<K extends string, A, B>(refinement: (a: NoInfer<A>, key: K) => a is B): (self: ReadonlyRecord<K, A>) => [excluded: Record<NonLiteralKey<K>, Exclude<A, B>>, satisfying: Record<NonLiteralKey<K>, B>];
<K extends string, A>(predicate: (a: NoInfer<A>, key: K) => boolean): (self: ReadonlyRecord<K, A>) => [excluded: Record<NonLiteralKey<K>, A>, satisfying: Record<NonLiteralKey<K>, A>];
<K extends string, A, B>(self: ReadonlyRecord<K, A>, refinement: (a: A, key: K) => a is B): [excluded: Record<NonLiteralKey<K>, Exclude<A, B>>, satisfying: Record<NonLiteralKey<K>, B>];
<K extends string, A>(self: ReadonlyRecord<K, A>, predicate: (a: A, key: K) => boolean): [excluded: Record<NonLiteralKey<K>, A>, satisfying: Record<NonLiteralKey<K>, A>];
}

Example

import * as assert from "node:assert"
import { partition } from "effect/Record"
assert.deepStrictEqual(
partition({ a: 1, b: 3 }, (n) => n > 2),
[{ a: 1 }, { b: 3 }]
)

partitionMap

Added in v2.0.0 Source

Partitions the elements of a record into two groups: those that match a predicate, and those that don't.

Signature

declare const partitionMap: {
<K extends string, A, B, C>(f: (a: A, key: K) => Either<C, B>): (self: ReadonlyRecord<K, A>) => [left: Record<NonLiteralKey<K>, B>, right: Record<NonLiteralKey<K>, C>];
<K extends string, A, B, C>(self: ReadonlyRecord<K, A>, f: (a: A, key: K) => Either<C, B>): [left: Record<NonLiteralKey<K>, B>, right: Record<NonLiteralKey<K>, C>];
}

Example

import * as assert from "node:assert"
import { Record, Either } from "effect"
const x = { a: 1, b: 2, c: 3 }
const f = (n: number) => (n % 2 === 0 ? Either.right(n) : Either.left(n))
assert.deepStrictEqual(Record.partitionMap(x, f), [{ a: 1, c: 3 }, { b: 2}])

separate

Added in v2.0.0 Source

Partitions a record of Either values into two separate records, one with the Left values and one with the Right values.

Signature

declare const separate: <K extends string, A, B>(self: ReadonlyRecord<K, Either<B, A>>) => [Record<ReadonlyRecord.NonLiteralKey<K>, A>, Record<ReadonlyRecord.NonLiteralKey<K>, B>]

Example

import * as assert from "node:assert"
import { Record, Either } from "effect"
assert.deepStrictEqual(
Record.separate({ a: Either.left("e"), b: Either.right(1) }),
[{ a: "e" }, { b: 1 }]
)

Folding

reduce

Added in v2.0.0 Source

Reduce a record to a single value by combining its entries with a specified function.

Signature

declare const reduce: {
<Z, V, K extends string>(zero: Z, f: (accumulator: Z, value: V, key: K) => Z): (self: ReadonlyRecord<K, V>) => Z;
<K extends string, V, Z>(self: ReadonlyRecord<K, V>, zero: Z, f: (accumulator: Z, value: V, key: K) => Z): Z;
}

Guards

Determine if a record is empty.

Signature

declare const isEmptyReadonlyRecord: <K extends string, A>(self: ReadonlyRecord<K, A>) => self is ReadonlyRecord<K, never>

Example

import * as assert from "node:assert"
import { isEmptyReadonlyRecord } from "effect/Record"
assert.deepStrictEqual(isEmptyReadonlyRecord({}), true);
assert.deepStrictEqual(isEmptyReadonlyRecord({ a: 3 }), false);

Determine if a record is empty.

Signature

declare function isEmptyRecord<K extends string, A>(self: Record<K, A>): self is Record<K, never>

Example

import * as assert from "node:assert"
import { isEmptyRecord } from "effect/Record"
assert.deepStrictEqual(isEmptyRecord({}), true);
assert.deepStrictEqual(isEmptyRecord({ a: 3 }), false);

Instances

Create an Equivalence for records using the provided Equivalence for values.

Signature

declare function getEquivalence<K extends string, A>(equivalence: Equivalence<A>): Equivalence<ReadonlyRecord<K, A>>

Mapping

map

Added in v2.0.0 Source

Maps a record into another record by applying a transformation function to each of its values.

Signature

declare const map: {
<K extends string, A, B>(f: (a: A, key: NoInfer<K>) => B): (self: ReadonlyRecord<K, A>) => Record<K, B>;
<K extends string, A, B>(self: ReadonlyRecord<K, A>, f: (a: A, key: NoInfer<K>) => B): Record<K, B>;
}

Example

import * as assert from "node:assert"
import { map } from "effect/Record"
const f = (n: number) => `-${n}`
assert.deepStrictEqual(map({ a: 3, b: 5 }, f), { a: "-3", b: "-5" })
const g = (n: number, key: string) => `${key.toUpperCase()}-${n}`
assert.deepStrictEqual(map({ a: 3, b: 5 }, g), { a: "A-3", b: "B-5" })

mapEntries

Added in v2.0.0 Source

Maps entries of a ReadonlyRecord using the provided function, allowing modification of both keys and corresponding values.

Signature

declare const mapEntries: {
<K extends string, A, K2 extends string, B>(f: (a: A, key: K) => readonly [K2, B]): (self: ReadonlyRecord<K, A>) => Record<K2, B>;
<K extends string, A, K2 extends string, B>(self: ReadonlyRecord<K, A>, f: (a: A, key: K) => [K2, B]): Record<K2, B>;
}

Example

import * as assert from "node:assert"
import { mapEntries } from "effect/Record"
assert.deepStrictEqual(mapEntries({ a: 3, b: 5 }, (a, key) => [key.toUpperCase(), a + 1]), { A: 4, B: 6 })

mapKeys

Added in v2.0.0 Source

Maps the keys of a ReadonlyRecord while preserving the corresponding values.

Signature

declare const mapKeys: {
<K extends string, A, K2 extends string>(f: (key: K, a: A) => K2): (self: ReadonlyRecord<K, A>) => Record<K2, A>;
<K extends string, A, K2 extends string>(self: ReadonlyRecord<K, A>, f: (key: K, a: A) => K2): Record<K2, A>;
}

Example

import * as assert from "node:assert"
import { mapKeys } from "effect/Record"
assert.deepStrictEqual(mapKeys({ a: 3, b: 5 }, (key) => key.toUpperCase()), { A: 3, B: 5 })

Models

ReadonlyRecord type

Added in v2.0.0 Source

Signature

type ReadonlyRecord<in out K extends string | symbol, out A> = { [P in K]: A }

Other

difference

Added in v2.0.0 Source

Merge two records, preserving only the entries that are unique to each record.

Signature

declare const difference: {
<K1 extends string, B>(that: ReadonlyRecord<K1, B>): <K0 extends string, A>(self: ReadonlyRecord<K0, A>) => Record<K0 | K1, A | B>;
<K0 extends string, A, K1 extends string, B>(self: ReadonlyRecord<K0, A>, that: ReadonlyRecord<K1, B>): Record<K0 | K1, A | B>;
}

every

Added in v2.0.0 Source

Check if all entries in a record meet a specific condition.

Signature

declare const every: {
<A, K extends string, B>(refinement: (value: A, key: K) => value is B): (self: ReadonlyRecord<K, A>) => self is ReadonlyRecord<K, B>;
<A, K extends string>(predicate: (value: A, key: K) => boolean): (self: ReadonlyRecord<K, A>) => boolean;
<A, K extends string, B>(self: ReadonlyRecord<K, A>, refinement: (value: A, key: K) => value is B): self is ReadonlyRecord<K, B>;
<K extends string, A>(self: ReadonlyRecord<K, A>, predicate: (value: A, key: K) => boolean): boolean;
}

filterMap

Added in v2.0.0 Source

Transforms a record into a record by applying the function f to each key and value in the original record. If the function returns Some, the key-value pair is included in the output record.

Signature

declare const filterMap: {
<K extends string, A, B>(f: (a: A, key: K) => Option<B>): (self: ReadonlyRecord<K, A>) => Record<ReadonlyRecord.NonLiteralKey<K>, B>;
<K extends string, A, B>(self: ReadonlyRecord<K, A>, f: (a: A, key: K) => Option<B>): Record<ReadonlyRecord.NonLiteralKey<K>, B>;
}

Example

import * as assert from "node:assert"
import { Record, Option } from "effect"
const x = { a: 1, b: 2, c: 3 }
const f = (a: number, key: string) => a > 2 ? Option.some(a * 2) : Option.none()
assert.deepStrictEqual(Record.filterMap(x, f), { c: 6 })

get

Added in v2.0.0 Source

Retrieve a value at a particular key from a record, returning it wrapped in an Option.

Signature

declare const get: {
<K extends string | symbol>(key: NoInfer<K>): <A>(self: ReadonlyRecord<K, A>) => Option<A>;
<K extends string | symbol, A>(self: ReadonlyRecord<K, A>, key: NoInfer<K>): Option<A>;
}

Example

import * as assert from "node:assert"
import { Record as R, Option } from "effect"
const person: Record<string, unknown> = { name: "John Doe", age: 35 }
assert.deepStrictEqual(R.get(person, "name"), Option.some("John Doe"))
assert.deepStrictEqual(R.get(person, "email"), Option.none())

has

Added in v2.0.0 Source

Check if a given key exists in a record.

Signature

declare const has: {
<K extends string | symbol>(key: NoInfer<K>): <A>(self: ReadonlyRecord<K, A>) => boolean;
<K extends string | symbol, A>(self: ReadonlyRecord<K, A>, key: NoInfer<K>): boolean;
}

Example

import * as assert from "node:assert"
import { empty, has } from "effect/Record"
assert.deepStrictEqual(has({ a: 1, b: 2 }, "a"), true);
assert.deepStrictEqual(has(empty<string>(), "c"), false);

intersection

Added in v2.0.0 Source

Merge two records, retaining only the entries that exist in both records.

Signature

declare const intersection: {
<K1 extends string, A, B, C>(that: ReadonlyRecord<K1, B>, combine: (selfValue: A, thatValue: B) => C): <K0 extends string>(self: ReadonlyRecord<K0, A>) => Record<ReadonlyRecord.IntersectKeys<K0, K1>, C>;
<K0 extends string, A, K1 extends string, B, C>(self: ReadonlyRecord<K0, A>, that: ReadonlyRecord<K1, B>, combine: (selfValue: A, thatValue: B) => C): Record<ReadonlyRecord.IntersectKeys<K0, K1>, C>;
}

isSubrecord

Added in v2.0.0 Source

Check if one record is a subrecord of another, meaning it contains all the keys and values found in the second record. This comparison uses default equality checks (Equal.equivalence()).

Signature

declare const isSubrecord: {
<K extends string, A>(that: ReadonlyRecord<K, A>): (self: ReadonlyRecord<K, A>) => boolean;
<K extends string, A>(self: ReadonlyRecord<K, A>, that: ReadonlyRecord<K, A>): boolean;
}

Check if all the keys and values in one record are also found in another record.

Signature

declare function isSubrecordBy<A>(equivalence: Equivalence<A>): {
<K extends string>(that: ReadonlyRecord<K, A>): (self: ReadonlyRecord<K, A>) => boolean;
<K extends string>(self: ReadonlyRecord<K, A>, that: ReadonlyRecord<K, A>): boolean;
}

keys

Added in v2.0.0 Source

Retrieve the keys of a given record as an array.

Signature

declare function keys<K extends string | symbol, A>(self: ReadonlyRecord<K, A>): Array<K & string>

modify

Added in v2.0.0 Source

Apply a function to the element at the specified key, creating a new record. If the key does not exist, the record is returned unchanged.

Signature

declare const modify: {
<K extends string | symbol, A, B>(key: NoInfer<K>, f: (a: A) => B): (self: ReadonlyRecord<K, A>) => Record<K, A | B>;
<K extends string | symbol, A, B>(self: ReadonlyRecord<K, A>, key: NoInfer<K>, f: (a: A) => B): Record<K, A | B>;
}

Example

import * as assert from "node:assert"
import { Record as R } from "effect"
const f = (x: number) => x * 2
assert.deepStrictEqual(
R.modify({ a: 3 }, 'a', f),
{ a: 6 }
)
assert.deepStrictEqual(
R.modify({ a: 3 } as Record<string, number>, 'b', f),
{ a: 3 }
)

modifyOption

Added in v2.0.0 Source

Apply a function to the element at the specified key, creating a new record, or return None if the key doesn't exist.

Signature

declare const modifyOption: {
<K extends string | symbol, A, B>(key: NoInfer<K>, f: (a: A) => B): (self: ReadonlyRecord<K, A>) => Option<Record<K, A | B>>;
<K extends string | symbol, A, B>(self: ReadonlyRecord<K, A>, key: NoInfer<K>, f: (a: A) => B): Option<Record<K, A | B>>;
}

Example

import * as assert from "node:assert"
import { Record as R, Option } from "effect"
const f = (x: number) => x * 2
assert.deepStrictEqual(
R.modifyOption({ a: 3 }, 'a', f),
Option.some({ a: 6 })
)
assert.deepStrictEqual(
R.modifyOption({ a: 3 } as Record<string, number>, 'b', f),
Option.none()
)

remove

Added in v2.0.0 Source

If the given key exists in the record, returns a new record with the key removed, otherwise returns a copy of the original record.

Signature

declare const remove: {
<K extends string | symbol, X extends string | symbol>(key: X): <A>(self: ReadonlyRecord<K, A>) => Record<Exclude<K, X>, A>;
<K extends string | symbol, A, X extends string | symbol>(self: ReadonlyRecord<K, A>, key: X): Record<Exclude<K, X>, A>;
}

Example

import * as assert from "node:assert"
import { remove } from "effect/Record"
assert.deepStrictEqual(remove({ a: 1, b: 2 }, "a"), { b: 2 })

replace

Added in v2.0.0 Source

Replace a key's value in a record and return the updated record. If the key does not exist in the record, a copy of the original record is returned.

Signature

declare const replace: {
<K extends string | symbol, B>(key: NoInfer<K>, value: B): <A>(self: ReadonlyRecord<K, A>) => Record<K, A | B>;
<K extends string | symbol, A, B>(self: ReadonlyRecord<K, A>, key: NoInfer<K>, value: B): Record<K, A | B>;
}

Example

import * as assert from "node:assert"
import { Record } from "effect"
assert.deepStrictEqual(Record.replace("a", 3)({ a: 1, b: 2 }), { a: 3, b: 2 });
assert.deepStrictEqual(Record.replace("c", 3)({ a: 1, b: 2 }), { a: 1, b: 2 });

Replaces a value in the record with the new value passed as parameter.

Signature

declare const replaceOption: {
<K extends string | symbol, B>(key: NoInfer<K>, b: B): <A>(self: ReadonlyRecord<K, A>) => Option<Record<K, B | A>>;
<K extends string | symbol, A, B>(self: ReadonlyRecord<K, A>, key: NoInfer<K>, b: B): Option<Record<K, A | B>>;
}

Example

import * as assert from "node:assert"
import { Record, Option } from "effect"
assert.deepStrictEqual(
Record.replaceOption({ a: 1, b: 2, c: 3 }, 'a', 10),
Option.some({ a: 10, b: 2, c: 3 })
)
assert.deepStrictEqual(Record.replaceOption(Record.empty<string>(), 'a', 10), Option.none())

set

Added in v2.0.0 Source

Add a new key-value pair or update an existing key's value in a record.

Signature

declare const set: {
<K extends string | symbol, K1 extends string | symbol, B>(key: K1, value: B): <A>(self: ReadonlyRecord<K, A>) => Record<K | K1, A | B>;
<K extends string | symbol, A, K1 extends string | symbol, B>(self: ReadonlyRecord<K, A>, key: K1, value: B): Record<K | K1, A | B>;
}

Example

import * as assert from "node:assert"
import { set } from "effect/Record"
assert.deepStrictEqual(set("a", 5)({ a: 1, b: 2 }), { a: 5, b: 2 });
assert.deepStrictEqual(set("c", 5)({ a: 1, b: 2 }), { a: 1, b: 2, c: 5 });

size

Added in v2.0.0 Source

Returns the number of key/value pairs in a record.

Signature

declare function size<K extends string, A>(self: ReadonlyRecord<K, A>): number

Example

import * as assert from "node:assert"
import { size } from "effect/Record";
assert.deepStrictEqual(size({ a: "a", b: 1, c: true }), 3);

some

Added in v2.0.0 Source

Check if any entry in a record meets a specific condition.

Signature

declare const some: {
<A, K extends string>(predicate: (value: A, key: K) => boolean): (self: ReadonlyRecord<K, A>) => boolean;
<K extends string, A>(self: ReadonlyRecord<K, A>, predicate: (value: A, key: K) => boolean): boolean;
}

union

Added in v2.0.0 Source

Merge two records, preserving entries that exist in either of the records.

Signature

declare const union: {
<K1 extends string, A, B, C>(that: ReadonlyRecord<K1, B>, combine: (selfValue: A, thatValue: B) => C): <K0 extends string>(self: ReadonlyRecord<K0, A>) => Record<K0 | K1, A | B | C>;
<K0 extends string, A, K1 extends string, B, C>(self: ReadonlyRecord<K0, A>, that: ReadonlyRecord<K1, B>, combine: (selfValue: A, thatValue: B) => C): Record<K0 | K1, A | B | C>;
}

values

Added in v2.0.0 Source

Retrieve the values of a given record as an array.

Signature

declare function values<K extends string, A>(self: ReadonlyRecord<K, A>): Array<A>

Record

pop

Added in v2.0.0 Source

Retrieves the value of the property with the given key from a record and returns an Option of a tuple with the value and the record with the removed property. If the key is not present, returns O.none.

Signature

declare const pop: {
<K extends string | symbol, X extends string | symbol>(key: X): <A>(self: ReadonlyRecord<K, A>) => Option<[A, Record<Exclude<K, X>, A>]>;
<K extends string | symbol, A, X extends string | symbol>(self: ReadonlyRecord<K, A>, key: X): Option<[A, Record<Exclude<K, X>, A>]>;
}

Example

import * as assert from "node:assert"
import { Record as R, Option } from "effect"
assert.deepStrictEqual(R.pop({ a: 1, b: 2 }, "a"), Option.some([1, { b: 2 }]))
assert.deepStrictEqual(R.pop({ a: 1, b: 2 } as Record<string, number>, "c"), Option.none())

Type Lambdas

ReadonlyRecordTypeLambda interface

Added in v2.0.0 Source

Signature

interface ReadonlyRecordTypeLambda<K extends string = string> extends TypeLambda {
readonly type: ReadonlyRecord<K, this["Target"]>;
}