Skip to content

FiberRef: `FiberRef` → `Context.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.

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

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)

Section titled “Scoped Updates (Effect.locally → Effect.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"
)

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
)