Hyperlinkv0.8.0-beta.28

Record

Record.filterMapconsteffect/Record.ts:733
<K extends string, A, B, X>(f: (input: A, key: K) => Result<B, X>): (
  self: ReadonlyRecord<K, A>
) => Record<ReadonlyRecord.NonLiteralKey<K>, B>
<K extends string, A, B, X>(
  self: ReadonlyRecord<K, A>,
  f: (input: A, key: K) => Result<B, X>
): Record<ReadonlyRecord.NonLiteralKey<K>, B>

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

Example (Filtering and mapping with Result)

import { Record, Result } from "effect"
import * as assert from "node:assert"

const x = { a: 1, b: 2, c: 3 }
const f = (a: number, key: string) => a > 2 ? Result.succeed(a * 2) : Result.failVoid
assert.deepStrictEqual(Record.filterMap(x, f), { c: 6 })
filtering
Source effect/Record.ts:73324 lines
export const filterMap: {
  <K extends string, A, B, X>(
    f: (input: A, key: K) => Result<B, X>
  ): (self: ReadonlyRecord<K, A>) => Record<ReadonlyRecord.NonLiteralKey<K>, B>
  <K extends string, A, B, X>(
    self: ReadonlyRecord<K, A>,
    f: (input: A, key: K) => Result<B, X>
  ): Record<ReadonlyRecord.NonLiteralKey<K>, B>
} = dual(
  2,
  <K extends string, A, B, X>(
    self: ReadonlyRecord<K, A>,
    f: (input: A, key: K) => Result<B, X>
  ): Record<ReadonlyRecord.NonLiteralKey<K>, B> => {
    const out: Record<string, B> = empty()
    for (const key of keys(self)) {
      const result = f(self[key], key)
      if (R.isSuccess(result)) {
        out[key] = result.success
      }
    }
    return out
  }
)