Skip to content

Commit de09d48

Browse files
authored
return a proxy Layer from LayerMap service (#4898)
1 parent 237a981 commit de09d48

File tree

2 files changed

+178
-114
lines changed

2 files changed

+178
-114
lines changed

.changeset/true-eagles-peel.md

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
---
2+
"effect": minor
3+
---
4+
5+
return a proxy Layer from LayerMap service
6+
7+
The new usage is:
8+
9+
```ts
10+
import { NodeRuntime } from "@effect/platform-node"
11+
import { Context, Effect, FiberRef, Layer, LayerMap } from "effect"
12+
13+
class Greeter extends Context.Tag("Greeter")<
14+
Greeter,
15+
{
16+
greet: Effect.Effect<string>
17+
}
18+
>() {}
19+
20+
// create a service that wraps a LayerMap
21+
class GreeterMap extends LayerMap.Service<GreeterMap>()("GreeterMap", {
22+
// define the lookup function for the layer map
23+
//
24+
// The returned Layer will be used to provide the Greeter service for the
25+
// given name.
26+
lookup: (name: string) =>
27+
Layer.succeed(Greeter, {
28+
greet: Effect.succeed(`Hello, ${name}!`)
29+
}),
30+
31+
// If a layer is not used for a certain amount of time, it can be removed
32+
idleTimeToLive: "5 seconds",
33+
34+
// Supply the dependencies for the layers in the LayerMap
35+
dependencies: []
36+
}) {}
37+
38+
// usage
39+
const program: Effect.Effect<void, never, GreeterMap> = Effect.gen(
40+
function* () {
41+
// access and use the Greeter service
42+
const greeter = yield* Greeter
43+
yield* Effect.log(yield* greeter.greet)
44+
}
45+
).pipe(
46+
// use the GreeterMap service to provide a variant of the Greeter service
47+
Effect.provide(GreeterMap.get("John"))
48+
)
49+
50+
// run the program
51+
program.pipe(Effect.provide(GreeterMap.Default), NodeRuntime.runMain)
52+
```

0 commit comments

Comments
 (0)