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

FiberSet overview

Added in v2.0.0


Table of contents


utils

FiberSet (interface)

Signature

export interface FiberSet<out A = unknown, out E = unknown>
  extends Pipeable,
    Inspectable.Inspectable,
    Iterable<Fiber.RuntimeFiber<A, E>> {
  readonly [TypeId]: TypeId
  readonly deferred: Deferred.Deferred<void, unknown>
  /** @internal */
  state:
    | {
        readonly _tag: "Open"
        readonly backing: Set<Fiber.RuntimeFiber<A, E>>
      }
    | {
        readonly _tag: "Closed"
      }
}

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

add

Add a fiber to the FiberSet. When the fiber completes, it will be removed.

Signature

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

Added in v2.0.0

clear

Signature

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

Added in v2.0.0

isFiberSet

Signature

export declare const isFiberSet: (u: unknown) => u is FiberSet<unknown, unknown>

Added in v2.0.0

join

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

Signature

export declare const join: <A, E>(self: FiberSet<A, E>) => Effect.Effect<void, E>

Example

import { Effect, FiberSet } from "effect"

Effect.gen(function* (_) {
  const set = yield* _(FiberSet.make())
  yield* _(FiberSet.add(set, Effect.runFork(Effect.fail("error"))))

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

Added in v2.0.0

make

A FiberSet can be used to store a collection of fibers. When the associated Scope is closed, all fibers in the set will be interrupted.

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

Signature

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

Example

import { Effect, FiberSet } from "effect"

Effect.gen(function* (_) {
  const set = yield* _(FiberSet.make())

  // run some effects and add the fibers to the set
  yield* _(FiberSet.run(set, Effect.never))
  yield* _(FiberSet.run(set, 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 FiberSet.

Signature

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

Added in v2.0.0

run

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

Signature

export declare const run: {
  <A, E>(
    self: FiberSet<A, E>
  ): <R, XE extends E, XA extends A>(
    effect: Effect.Effect<XA, XE, R>
  ) => Effect.Effect<Fiber.RuntimeFiber<XA, XE>, never, R>
  <A, E, R, XE extends E, XA extends A>(
    self: FiberSet<A, E>,
    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 FiberSet.

Signature

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

Example

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

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

Effect.gen(function* (_) {
  const set = yield* _(FiberSet.make())
  const run = yield* _(FiberSet.runtime(set)<Users>())

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

Added in v2.0.0

size

Signature

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

Added in v2.0.0

unsafeAdd

Add a fiber to the FiberSet. When the fiber completes, it will be removed.

Signature

export declare const unsafeAdd: {
  <A, E, XE extends E, XA extends A>(
    fiber: Fiber.RuntimeFiber<XA, XE>,
    options?: { readonly interruptAs?: FiberId.FiberId | undefined } | undefined
  ): (self: FiberSet<A, E>) => void
  <A, E, XE extends E, XA extends A>(
    self: FiberSet<A, E>,
    fiber: Fiber.RuntimeFiber<XA, XE>,
    options?: { readonly interruptAs?: FiberId.FiberId | undefined } | undefined
  ): void
}

Added in v2.0.0