<
const Layers extends Record<string, Layer.Layer<any, any, any>>,
const Preload extends boolean = false
>(
layers: Layers,
options?:
| {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<keyof Layers>
| undefined
readonly preload?: Preload | undefined
}
| undefined
): Effect.Effect<
LayerMap<
keyof Layers,
Layer.Success<Layers[keyof Layers]>,
Layer.Error<Layers[keyof Layers]>
>,
Preload extends true ? Layer.Error<Layers[keyof Layers]> : never,
| Scope.Scope
| (Layers[keyof Layers] extends Layer.Layer<
infer _A,
infer _E,
infer _R
>
? _R
: never)
>Creates a LayerMap from a record of predefined layers.
Details
The record keys become the keys accepted by the returned LayerMap, and the
record values are the layers built for those keys.
Example (Creating a layer map from a record)
import { Context, Effect, Layer, LayerMap } from "effect"
// Define service keys
const DevDatabase = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("DevDatabase")
const ProdDatabase = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("ProdDatabase")
// Create predefined layers
const layers = {
development: Layer.succeed(DevDatabase)({
query: Effect.fn("DevDatabase.query")((sql) => Effect.succeed(`DEV: ${sql}`))
}),
production: Layer.succeed(ProdDatabase)({
query: Effect.fn("ProdDatabase.query")((sql) => Effect.succeed(`PROD: ${sql}`))
})
} as const
// Create a LayerMap from the record
const program = Effect.gen(function*() {
const layerMap = yield* LayerMap.fromRecord(layers, {
idleTimeToLive: "10 seconds"
})
// Get layers by key
const devLayer = layerMap.get("development")
const prodLayer = layerMap.get("production")
console.log("LayerMap created from record")
})export const const fromRecord: <
Layers extends Record<
string,
Layer.Layer<any, any, any>
>,
Preload extends boolean = false
>(
layers: Layers,
options?:
| {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<keyof Layers>
| undefined
readonly preload?: Preload | undefined
}
| undefined
) => Effect.Effect<
LayerMap<
keyof Layers,
Layer.Success<Layers[keyof Layers]>,
Layer.Error<Layers[keyof Layers]>
>,
Preload extends true
? Layer.Error<Layers[keyof Layers]>
: never,
| Scope.Scope
| (Layers[keyof Layers] extends Layer.Layer<
infer _A,
infer _E,
infer _R
>
? _R
: never)
>
Creates a LayerMap from a record of predefined layers.
Details
The record keys become the keys accepted by the returned LayerMap, and the
record values are the layers built for those keys.
Example (Creating a layer map from a record)
import { Context, Effect, Layer, LayerMap } from "effect"
// Define service keys
const DevDatabase = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("DevDatabase")
const ProdDatabase = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("ProdDatabase")
// Create predefined layers
const layers = {
development: Layer.succeed(DevDatabase)({
query: Effect.fn("DevDatabase.query")((sql) => Effect.succeed(`DEV: ${sql}`))
}),
production: Layer.succeed(ProdDatabase)({
query: Effect.fn("ProdDatabase.query")((sql) => Effect.succeed(`PROD: ${sql}`))
})
} as const
// Create a LayerMap from the record
const program = Effect.gen(function*() {
const layerMap = yield* LayerMap.fromRecord(layers, {
idleTimeToLive: "10 seconds"
})
// Get layers by key
const devLayer = layerMap.get("development")
const prodLayer = layerMap.get("production")
console.log("LayerMap created from record")
})
fromRecord = <
const function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers extends type Record<K extends keyof any, T> = {
[P in K]: T
}
Construct a type with a set of properties K of type T
Record<string, import LayerLayer.type Layer.Layer = /*unresolved*/ anyLayer<any, any, any>>,
const function (type parameter) Preload in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Preload extends boolean = false
>(
layers: const Layers extends Record<string, Layer.Layer<any, any, any>>layers: function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers,
options: | {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<keyof Layers>
| undefined
readonly preload?: Preload | undefined
}
| undefined
options?: {
readonly idleTimeToLive?: anyidleTimeToLive?: type IdleTimeToLiveInput<K> = anyIdleTimeToLiveInput<keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers> | undefined
readonly preload?: Preload | undefinedpreload?: function (type parameter) Preload in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Preload | undefined
} | undefined
): import EffectEffect.type Effect.Effect = /*unresolved*/ anyEffect<
interface LayerMap<in out K, in out I, in out E = never>A scoped, keyed map of layer-built service contexts.
Details
A LayerMap builds resources for a key on demand, exposes them as a Layer
or scoped Context, and can invalidate cached resources for a key.
Example (Managing keyed layers)
import { Context, Effect, Layer, LayerMap } from "effect"
// Define a service key
const DatabaseService = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("Database")
// Create a LayerMap that provides different database configurations
const createDatabaseLayerMap = LayerMap.make((env: string) =>
Layer.succeed(DatabaseService)({
query: Effect.fn("DatabaseService.query")((sql) => Effect.succeed(`${env}: ${sql}`))
})
)
// Use the LayerMap
const program = Effect.gen(function*() {
const layerMap = yield* createDatabaseLayerMap
// Get a layer for a specific environment
const devLayer = layerMap.get("development")
// Get context directly
const context = yield* layerMap.contextEffect("production")
// Invalidate a cached layer
yield* layerMap.invalidate("development")
})
LayerMap<
keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers,
import LayerLayer.type Layer.Success = /*unresolved*/ anySuccess<function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers[keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers]>,
import LayerLayer.type Layer.Error = /*unresolved*/ anyError<function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers[keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers]>
>,
function (type parameter) Preload in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Preload extends true ? import LayerLayer.type Layer.Error = /*unresolved*/ anyError<function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers[keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers]> : never,
import ScopeScope.Scope | (function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers[keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers] extends import LayerLayer.type Layer.Layer = /*unresolved*/ anyLayer<infer function (type parameter) _A_A, infer function (type parameter) _E_E, infer function (type parameter) _R_R> ? function (type parameter) _R_R : never)
> =>
const make: <
K,
L extends Layer.Layer<any, any, any>,
PreloadKeys extends
| Iterable<K>
| undefined = undefined
>(
lookup: (key: K) => L,
options?:
| {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<K>
| undefined
readonly preloadKeys?: PreloadKeys
}
| undefined
) => Effect.Effect<
LayerMap<K, Layer.Success<L>, Layer.Error<L>>,
PreloadKeys extends undefined
? never
: Layer.Error<L>,
Scope.Scope | Layer.Services<L>
>
Creates a LayerMap that dynamically provides resources based on a key.
Example (Creating a layer map)
import { Context, Effect, Layer, LayerMap } from "effect"
// Define a service key
const DatabaseService = Context.Service<{
readonly query: (sql: string) => Effect.Effect<string>
}>("Database")
// Create a LayerMap that provides different database configurations
const program = Effect.gen(function*() {
const layerMap = yield* LayerMap.make(
(env: string) =>
Layer.succeed(DatabaseService)({
query: Effect.fn("DatabaseService.query")((sql) => Effect.succeed(`${env}: ${sql}`))
}),
{ idleTimeToLive: "5 seconds" }
)
// Get a layer for a specific environment
const devLayer = layerMap.get("development")
// Use the layer to provide the service
const result = yield* Effect.provide(
Effect.gen(function*() {
const db = yield* DatabaseService
return yield* db.query("SELECT * FROM users")
}),
devLayer
)
console.log(result) // "development: SELECT * FROM users"
})
make((key: keyof Layerskey: keyof function (type parameter) Layers in <const Layers extends Record<string, Layer.Layer<any, any, any>>, const Preload extends boolean = false>(layers: Layers, options?: {
readonly idleTimeToLive?: IdleTimeToLiveInput<keyof Layers> | undefined;
readonly preload?: Preload | undefined;
} | undefined): Effect.Effect<LayerMap<keyof Layers, Layer.Success<Layers[keyof Layers]>, Layer.Error<Layers[keyof Layers]>>, Preload extends true ? Layer.Error<Layers[keyof Layers]> : never, Scope.Scope | (Layers[keyof Layers] extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never)>
Layers) => layers: const Layers extends Record<string, Layer.Layer<any, any, any>>layers[key: keyof Layerskey], {
...options: | {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<keyof Layers>
| undefined
readonly preload?: Preload | undefined
}
| undefined
options,
preloadKeys?: string[] | undefinedpreloadKeys: options: | {
readonly idleTimeToLive?:
| IdleTimeToLiveInput<keyof Layers>
| undefined
readonly preload?: Preload | undefined
}
| undefined
options?.preload?: Preload | undefinedpreload ? var Object: ObjectConstructorProvides functionality common to all JavaScript objects.
Object.ObjectConstructor.keys(o: {}): string[] (+1 overload)Returns the names of the enumerable string properties and methods of an object.
keys(layers: const Layers extends Record<string, Layer.Layer<any, any, any>>layers) : var undefinedundefined
}) as any