Skip to main content Link Search Menu Expand Document (external link)

FiberMap overview

Added in v2.0.0


Table of contents


utils

FiberMap (interface)

Signature

export interface FiberMap<in out K, out A = unknown, out E = unknown>
  extends Pipeable,
    Inspectable.Inspectable,
    Iterable<[K, Fiber.RuntimeFiber<A, E>]> {
  readonly [TypeId]: TypeId
  readonly backing: MutableHashMap.MutableHashMap<K, Fiber.RuntimeFiber<A, E>>
  readonly deferred: Deferred.Deferred<never, unknown>
}

Added in v2.0.0

TypeId

Signature

export declare const TypeId: typeof TypeId

Added in v2.0.0

TypeId (type alias)

Signature

export type TypeId = typeof TypeId

Added in v2.0.0

clear

Signature

export declare const clear: <K, A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>

Added in v2.0.0

get

Retrieve a fiber from the FiberMap.

Signature

export declare const get: {
  <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
  <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<Fiber.RuntimeFiber<A, E>, NoSuchElementException>
}

Added in v2.0.0

isFiberMap

Signature

export declare const isFiberMap: (u: unknown) => u is FiberMap<unknown, unknown, unknown>

Added in v2.0.0

join

Join all fibers in the FiberMap. If any of the Fiber’s in the map terminate with a failure, the returned Effect will terminate with the first failure that occurred.

Signature

export declare const join: <K, A, E>(self: FiberMap<K, A, E>) => Effect.Effect<never, E>

Example

import { Effect, FiberMap } from "effect"

Effect.gen(function* (_) {
  const map = yield* _(FiberMap.make())
  yield* _(FiberMap.set(map, "a", Effect.runFork(Effect.fail("error"))))

  // parent fiber will fail with "error"
  yield* _(FiberMap.join(map))
})

Added in v2.0.0

make

A FiberMap can be used to store a collection of fibers, indexed by some key. When the associated Scope is closed, all fibers in the map will be interrupted.

You can add fibers to the map using FiberMap.set or FiberMap.run, and the fibers will be automatically removed from the FiberMap when they complete.

Signature

export declare const make: <K, A = unknown, E = unknown>() => Effect.Effect<FiberMap<K, A, E>, never, Scope.Scope>

Example

import { Effect, FiberMap } from "effect"

Effect.gen(function* (_) {
  const map = yield* _(FiberMap.make<string>())

  // run some effects and add the fibers to the map
  yield* _(FiberMap.run(map, "fiber a", Effect.never))
  yield* _(FiberMap.run(map, "fiber b", Effect.never))

  yield* _(Effect.sleep(1000))
}).pipe(
  Effect.scoped // The fibers will be interrupted when the scope is closed
)

Added in v2.0.0

makeRuntime

Create an Effect run function that is backed by a FiberMap.

Signature

export declare const makeRuntime: <R, K, E = unknown, A = unknown>() => Effect.Effect<
  <XE extends E, XA extends A>(
    key: K,
    effect: Effect.Effect<XA, XE, R>,
    options?: Runtime.RunForkOptions | undefined
  ) => Fiber.RuntimeFiber<XA, XE>,
  never,
  any
>

Added in v2.0.0

remove

Remove a fiber from the FiberMap, interrupting it if it exists.

Signature

export declare const remove: {
  <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Effect.Effect<void>
  <K, A, E>(self: FiberMap<K, A, E>, key: K): Effect.Effect<void>
}

Added in v2.0.0

run

Run an Effect and add the forked fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap.

Signature

export declare const run: {
  <K, A, E>(
    self: FiberMap<K, A, E>,
    key: K
  ): <R, XE extends E, XA extends A>(
    effect: Effect.Effect<XA, XE, R>
  ) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
  <K, A, E, R, XE extends E, XA extends A>(
    self: FiberMap<K, A, E>,
    key: K,
    effect: Effect.Effect<XA, XE, R>
  ): Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
}

Added in v2.0.0

runtime

Capture a Runtime and use it to fork Effect’s, adding the forked fibers to the FiberMap.

Signature

export declare const runtime: <K, A, E>(
  self: FiberMap<K, A, E>
) => <R = never>() => Effect.Effect<
  <XE extends E, XA extends A>(
    key: K,
    effect: Effect.Effect<XA, XE, R>,
    options?: Runtime.RunForkOptions | undefined
  ) => Fiber.RuntimeFiber<XA, XE>,
  never,
  R
>

Example

import { Context, Effect, FiberMap } from "effect"

interface Users {
  readonly _: unique symbol
}
const Users = Context.GenericTag<
  Users,
  {
    getAll: Effect.Effect<Array<unknown>>
  }
>("Users")

Effect.gen(function* (_) {
  const map = yield* _(FiberMap.make<string>())
  const run = yield* _(FiberMap.runtime(map)<Users>())

  // run some effects and add the fibers to the map
  run(
    "effect-a",
    Effect.andThen(Users, (_) => _.getAll)
  )
  run(
    "effect-b",
    Effect.andThen(Users, (_) => _.getAll)
  )
}).pipe(
  Effect.scoped // The fibers will be interrupted when the scope is closed
)

Added in v2.0.0

set

Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap. If the key already exists in the FiberMap, the previous fiber will be interrupted.

Signature

export declare const set: {
  <K, A, E, XE extends E, XA extends A>(
    key: K,
    fiber: Fiber.RuntimeFiber<XA, XE>
  ): (self: FiberMap<K, A, E>) => Effect.Effect<void>
  <K, A, E, XE extends E, XA extends A>(
    self: FiberMap<K, A, E>,
    key: K,
    fiber: Fiber.RuntimeFiber<XA, XE>
  ): Effect.Effect<void>
}

Added in v2.0.0

size

Signature

export declare const size: <K, A, E>(self: FiberMap<K, A, E>) => Effect.Effect<number>

Added in v2.0.0

unsafeGet

Retrieve a fiber from the FiberMap.

Signature

export declare const unsafeGet: {
  <K>(key: K): <A, E>(self: FiberMap<K, A, E>) => Option.Option<Fiber.RuntimeFiber<A, E>>
  <K, A, E>(self: FiberMap<K, A, E>, key: K): Option.Option<Fiber.RuntimeFiber<A, E>>
}

Added in v2.0.0

unsafeSet

Add a fiber to the FiberMap. When the fiber completes, it will be removed from the FiberMap. If the key already exists in the FiberMap, the previous fiber will be interrupted.

Signature

export declare const unsafeSet: {
  <K, A, E, XE extends E, XA extends A>(
    key: K,
    fiber: Fiber.RuntimeFiber<XA, XE>,
    interruptAs?: FiberId.FiberId
  ): (self: FiberMap<K, A, E>) => void
  <K, A, E, XE extends E, XA extends A>(
    self: FiberMap<K, A, E>,
    key: K,
    fiber: Fiber.RuntimeFiber<XA, XE>,
    interruptAs?: FiberId.FiberId
  ): void
}

Added in v2.0.0