import { Context, Effect, Layer, LayerMap, pipe } from "effect"
const buildFoo = (): Context.Tag.Service<Api> => {
console.log("building foo")
return { foo: () => "foo" }
}
class Api extends Effect.Tag("Api")<Api, { foo: () => string }>() {
static layer = () => Layer.succeed(Api, buildFoo())
}
class ApiMap extends LayerMap.Service<ApiMap>()(
"ApiMap",
{
lookup: (_: "foo" | "bar") => Layer.succeed(Api, buildFoo()),
idleTimeToLive: "1 hour",
dependencies: []
}
) {
static layerMock = () =>
Layer.scoped(
this,
LayerMap.make(() => Api.layer())
)
}
const effect = Effect.provide(Api.foo(), ApiMap.get("foo"))
console.log("with Map")
pipe(Effect.all([effect, effect, effect]), Effect.provide(ApiMap.layerMock()), Effect.runSync) // -> "building foo" gets logged 3 times
console.log("without Map")
pipe(Effect.all([Api.foo(), Api.foo(), Api.foo()]), Effect.provide(Api.layer()), Effect.runSync) // -> "building foo" gets logged only once
import { Context, Effect, Layer, LayerMap, pipe } from "effect"
const buildFoo = (): Context.Tag.Service<Api> => {
console.log("building foo")
return { foo: () => "foo" }
}
class Api extends Effect.Tag("Api")<Api, { foo: () => string }>() {
static layer = () => Layer.succeed(Api, buildFoo())
}
class ApiMap extends LayerMap.Service<ApiMap>()(
"ApiMap",
{
lookup: (_: "foo" | "bar") => Layer.succeed(Api, buildFoo()),
idleTimeToLive: "1 hour",
dependencies: []
}
) {
static layerMock = () =>
Layer.scoped(
this,
LayerMap.make(() => Api.layer())
)
}
const effect = Effect.provide(Api.foo(), ApiMap.get("foo"))
console.log("with Map")
pipe(Effect.all([effect, effect, effect]), Effect.provide(ApiMap.layerMock()), Effect.runSync) // -> "building foo" gets logged 3 times
console.log("without Map")
pipe(Effect.all([Api.foo(), Api.foo(), Api.foo()]), Effect.provide(Api.layer()), Effect.runSync) // -> "building foo" gets logged only once