1# FiberRef: `FiberRef` → `Context.Reference`
2
3In v4, `FiberRef`, `FiberRefs`, `FiberRefsPatch`, and `Differ` have been removed.
4Fiber-local state is now handled by `Context.Reference` — the same mechanism
5used for services with default values.
6
7## Built-in References
8
9v3's built-in `FiberRef` values are now `Context.Reference` values exported
10from `References` and related modules.
11
12| v3 FiberRef | v4 Reference |
13| ----------------------------------- | ---------------------------------- |
14| `FiberRef.currentLogLevel` | `References.CurrentLogLevel` |
15| `FiberRef.currentMinimumLogLevel` | `References.MinimumLogLevel` |
16| `FiberRef.currentLogAnnotations` | `References.CurrentLogAnnotations` |
17| `FiberRef.currentLogSpan` | `References.CurrentLogSpans` |
18| `FiberRef.currentScheduler` | `References.Scheduler` |
19| `FiberRef.currentMaxOpsBeforeYield` | `References.MaxOpsBeforeYield` |
20| `FiberRef.currentTracerEnabled` | `References.TracerEnabled` |
21| `FiberRef.unhandledErrorLogLevel` | `References.UnhandledLogLevel` |
22
23## Reading References
24
25In v3, `FiberRef.get` retrieved the current value. In v4, references are
26services — `yield*` them directly.
27
28**v3**
29
30```ts
31import { Effect, FiberRef } from "effect"
32
33const program = Effect.gen(function*() {
34 const level = yield* FiberRef.get(FiberRef.currentLogLevel)
35 console.log(level)
36})
37```
38
39**v4**
40
41```ts
42import { Effect, References } from "effect"
43
44const program = Effect.gen(function*() {
45 const level = yield* References.CurrentLogLevel
46 console.log(level) // "Info" (default)
47})
48```
49
50## Scoped Updates (`Effect.locally` → `Effect.provideService`)
51
52v3's `Effect.locally` set a `FiberRef` value for the duration of an effect. In
53v4, use `Effect.provideService` with the reference.
54
55**v3**
56
57```ts
58import { Effect, FiberRef, LogLevel } from "effect"
59
60const program = Effect.locally(
61 myEffect,
62 FiberRef.currentLogLevel,
63 LogLevel.Debug
64)
65```
66
67**v4**
68
69```ts
70import { Effect, References } from "effect"
71
72const program = Effect.provideService(
73 myEffect,
74 References.CurrentLogLevel,
75 "Debug"
76)
77```
78
79## Writing References
80
81v3's `FiberRef.set` mutated the current fiber's ref value. In v4, references are
82set via `Effect.provideService`, which scopes the value to the provided effect.
83
84**v3**
85
86```ts
87import { Effect, FiberRef } from "effect"
88
89const program = Effect.gen(function*() {
90 yield* FiberRef.set(FiberRef.currentMaxOpsBeforeYield, 500)
91 // subsequent code sees maxOpsBeforeYield = 500
92})
93```
94
95**v4**
96
97```ts
98import { Effect, References } from "effect"
99
100const program = Effect.provideService(
101 Effect.gen(function*() {
102 const maxOps = yield* References.MaxOpsBeforeYield
103 console.log(maxOps) // 500
104 }),
105 References.MaxOpsBeforeYield,
106 500
107)
108```