110 lines
2.9 KiB
Markdown
110 lines
2.9 KiB
Markdown
# 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.
|
|
|
|
## 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**
|
|
|
|
```ts
|
|
import { Effect, FiberRef } from "effect"
|
|
|
|
const program = Effect.gen(function*() {
|
|
const level = yield* FiberRef.get(FiberRef.currentLogLevel)
|
|
console.log(level)
|
|
})
|
|
```
|
|
|
|
**v4**
|
|
|
|
```ts
|
|
import { Effect, References } from "effect"
|
|
|
|
const program = Effect.gen(function*() {
|
|
const level = yield* References.CurrentLogLevel
|
|
console.log(level) // "Info" (default)
|
|
})
|
|
```
|
|
|
|
## 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**
|
|
|
|
```ts
|
|
import { Effect, FiberRef, LogLevel } from "effect"
|
|
|
|
const program = Effect.locally(
|
|
myEffect,
|
|
FiberRef.currentLogLevel,
|
|
LogLevel.Debug
|
|
)
|
|
```
|
|
|
|
**v4**
|
|
|
|
```ts
|
|
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**
|
|
|
|
```ts
|
|
import { Effect, FiberRef } from "effect"
|
|
|
|
const program = Effect.gen(function*() {
|
|
yield* FiberRef.set(FiberRef.currentConcurrency, 10)
|
|
// subsequent code sees concurrency = 10
|
|
})
|
|
```
|
|
|
|
**v4**
|
|
|
|
```ts
|
|
import { Effect, References } from "effect"
|
|
|
|
const program = Effect.provideService(
|
|
Effect.gen(function*() {
|
|
const concurrency = yield* References.CurrentConcurrency
|
|
console.log(concurrency) // 10
|
|
}),
|
|
References.CurrentConcurrency,
|
|
10
|
|
)
|
|
```
|