Hyperlinkv0.8.0-beta.28

TxHashMap

TxHashMap.filterMapconsteffect/TxHashMap.ts:1623
<V, K, A, X>(f: (input: V, key: K) => Result<A, X>): (
  self: TxHashMap<K, V>
) => Effect.Effect<TxHashMap<K, A>>
<K, V, A, X>(
  self: TxHashMap<K, V>,
  f: (input: V, key: K) => Result<A, X>
): Effect.Effect<TxHashMap<K, A>>

Combines filtering and mapping in a single operation. Applies a filter to each entry, keeping only successful results and transforming them.

Details

This function returns a new TxHashMap reference containing only the transformed entries that succeeded. The original TxHashMap is not modified.

Example (Filtering and mapping entries)

import { Effect, Option, Result, TxHashMap } from "effect"

const program = Effect.gen(function*() {
  // Create a mixed data map
  const userData = yield* TxHashMap.make(
    ["alice", { age: "30", role: "admin", active: true }],
    ["bob", { age: "invalid", role: "user", active: true }],
    ["charlie", { age: "25", role: "admin", active: false }],
    ["diana", { age: "28", role: "user", active: true }]
  )

  // Extract valid ages for active admin users only
  const activeAdminAges = yield* TxHashMap.filterMap(
    userData,
    (user, username) => {
      if (!user.active || user.role !== "admin") return Result.failVoid
      const age = parseInt(user.age)
      if (isNaN(age)) return Result.failVoid
      return Result.succeed({
        username,
        age,
        seniority: age > 27 ? "senior" : "junior"
      })
    }
  )

  const aliceData = yield* TxHashMap.get(activeAdminAges, "alice")
  console.log(aliceData) // Option.some({ username: "alice", age: 30, seniority: "senior" })

  const charlieData = yield* TxHashMap.get(activeAdminAges, "charlie")
  console.log(charlieData) // Option.none() (not active)

  // Data-last usage with pipe
  const validAges = yield* userData.pipe(
    TxHashMap.filterMap((user) => {
      const age = parseInt(user.age)
      return isNaN(age) ? Result.failVoid : Result.succeed(age)
    })
  )

  const size = yield* TxHashMap.size(validAges)
  console.log(size) // 3 (alice, charlie, diana have valid ages)
})
combinators
export const filterMap: {
  <V, K, A, X>(
    f: (input: V, key: K) => Result<A, X>
  ): (self: TxHashMap<K, V>) => Effect.Effect<TxHashMap<K, A>>
  <K, V, A, X>(
    self: TxHashMap<K, V>,
    f: (input: V, key: K) => Result<A, X>
  ): Effect.Effect<TxHashMap<K, A>>
} = dual(
  2,
  <K, V, A, X>(
    self: TxHashMap<K, V>,
    f: (input: V, key: K) => Result<A, X>
  ): Effect.Effect<TxHashMap<K, A>> =>
    Effect.gen(function*() {
      const currentMap = yield* TxRef.get(self.ref)
      const filteredMap = HashMap.filterMap(currentMap, f)
      return yield* fromHashMap(filteredMap)
    }).pipe(Effect.tx)
)