Files

2.9 KiB

FiberRef: FiberRefContext.Reference

In v4, FiberRef, FiberRefs, FiberRefsPatch, and Differ have been removed. Fiber-local state is now handled by Context.Reference — the same mechanism used for services with default values.

Built-in References

v3's built-in FiberRef values are now Context.Reference values exported from References and related modules.

v3 FiberRef v4 Reference
FiberRef.currentConcurrency References.CurrentConcurrency
FiberRef.currentLogLevel References.CurrentLogLevel
FiberRef.currentMinimumLogLevel References.MinimumLogLevel
FiberRef.currentLogAnnotations References.CurrentLogAnnotations
FiberRef.currentLogSpan References.CurrentLogSpans
FiberRef.currentScheduler References.Scheduler
FiberRef.currentMaxOpsBeforeYield References.MaxOpsBeforeYield
FiberRef.currentTracerEnabled References.TracerEnabled
FiberRef.unhandledErrorLogLevel References.UnhandledLogLevel

Reading References

In v3, FiberRef.get retrieved the current value. In v4, references are services — yield* them directly.

v3

import { Effect, FiberRef } from "effect"

const program = Effect.gen(function*() {
  const level = yield* FiberRef.get(FiberRef.currentLogLevel)
  console.log(level)
})

v4

import { Effect, References } from "effect"

const program = Effect.gen(function*() {
  const level = yield* References.CurrentLogLevel
  console.log(level) // "Info" (default)
})

Scoped Updates (Effect.locallyEffect.provideService)

v3's Effect.locally set a FiberRef value for the duration of an effect. In v4, use Effect.provideService with the reference.

v3

import { Effect, FiberRef, LogLevel } from "effect"

const program = Effect.locally(
  myEffect,
  FiberRef.currentLogLevel,
  LogLevel.Debug
)

v4

import { Effect, References } from "effect"

const program = Effect.provideService(
  myEffect,
  References.CurrentLogLevel,
  "Debug"
)

Writing References

v3's FiberRef.set mutated the current fiber's ref value. In v4, references are set via Effect.provideService, which scopes the value to the provided effect.

v3

import { Effect, FiberRef } from "effect"

const program = Effect.gen(function*() {
  yield* FiberRef.set(FiberRef.currentConcurrency, 10)
  // subsequent code sees concurrency = 10
})

v4

import { Effect, References } from "effect"

const program = Effect.provideService(
  Effect.gen(function*() {
    const concurrency = yield* References.CurrentConcurrency
    console.log(concurrency) // 10
  }),
  References.CurrentConcurrency,
  10
)