LayerMap
Constructors
fromRecord
Added in v3.14.0
Source
Signature
declare function fromRecord<Layers extends Record<string, Layer<any, any, any>>, Preload extends boolean = false>(layers: Layers, options?: { readonly idleTimeToLive?: DurationInput; readonly preload?: Preload;}): Effect<LayerMap<keyof Layers, Layers[keyof Layers] extends Layer<_A, _E, _R> ? _A : never, Preload extends true ? never : Layers[keyof Layers] extends Layer<_A, _E, _R> ? _E : never>, Preload extends true ? never : Layers[keyof Layers] extends Layer<_A, _E, _R> ? _E : never, Scope | Layers[keyof Layers] extends Layer<_A, _E, _R> ? _R : never>Constructors A `LayerMap` Allows You To Create A Map Of Layer'S That Can Be Used To Dynamically Access Resources Based On A Key. ```Ts Import { NodeRuntime } From "@Effect/Platform-Node" Import { Context, Effect, FiberRef, Layer, LayerMap } From "Effect" Class Greeter Extends Context.Tag("Greeter")<Greeter, { Greet: Effect.Effect<String> }>() {} // Create A Service That Wraps A LayerMap Class GreeterMap Extends LayerMap.Service<GreeterMap>()("GreeterMap", { // Define The Lookup Function For The Layer Map // // The Returned Layer Will Be Used To Provide The Greeter Service For The // Given Name. Lookup: (Name: String) => Layer.Succeed(Greeter, { Greet: Effect.Succeed(`Hello, ${Name}!`) }).Pipe( Layer.Merge(Layer.LocallyScoped(FiberRef.CurrentConcurrency, 123)) ), // If A Layer Is Not Used For A Certain Amount Of Time, It Can Be Removed IdleTimeToLive: "5 Seconds", // Supply The Dependencies For The Layers In The LayerMap Dependencies: [] }) {} // Usage Const Program: Effect.Effect<Void, Never, GreeterMap> = Effect.Gen(Function*() { // Access And Use The Greeter Service Const Greeter = Yield* Greeter Yield* Effect.Log(Yield* Greeter.Greet) }).Pipe( // Use The GreeterMap Service To Provide A Variant Of The Greeter Service Effect.Provide(GreeterMap.Get("John")) ) // Run The Program Program.Pipe( Effect.Provide(GreeterMap.Default), NodeRuntime.RunMain ) ```
Signature
declare const make: <K, L extends Layer.Layer<any, any, any>, PreloadKeys extends Iterable<K> | undefined = undefined>(lookup: (key: K) => L, options?: { readonly idleTimeToLive?: Duration.DurationInput; readonly preloadKeys?: PreloadKeys;}) => Effect.Effect<LayerMap<K, L extends Layer.Layer<infer _A, infer _E, infer _R> ? _A : never, L extends Layer.Layer<infer _A, infer _E, infer _R> ? _E : never>, PreloadKeys extends undefined ? never : L extends Layer.Layer<infer _A, infer _E, infer _R> ? _E : never, Scope.Scope | L extends Layer.Layer<infer _A, infer _E, infer _R> ? _R : never>Models
Signature
interface LayerMap<in K, in out I, out E = never> { readonly [TypeId]: typeof TypeId; readonly rcMap: RcMap<K, { readonly layer: Layer<I, E>; readonly runtimeEffect: Effect<Runtime<I>, E, Scope>; }, E>; get(key: K): Layer<I, E>; invalidate(key: K): Effect<void>; runtime(key: K): Effect<Runtime<I>, E, Scope>;}Service
Signature
interface TagClass<in out Self, in out Id extends string, in out K, in out I, in out E, in out R, in out LE, in out Deps extends Layer.Layer<any, any, any>> extends TagClass<Self, Id, LayerMap<K, I, E>> { constructor(_: never); readonly Default: Layer<Self, LE | Deps extends Layer<_A, _E, _R> ? _E : never, Exclude<R, Deps extends Layer<_A, _E, _R> ? _A : never> | Deps extends Layer<_A, _E, _R> ? _R : never>; readonly DefaultWithoutDependencies: Layer<Self, LE, R>; readonly get: (key: K) => Layer<I, E, Self>; readonly invalidate: (key: K) => Effect<void, never, Self>; readonly runtime: (key: K) => Effect<Runtime<I>, E, Scope | Self>;}Service Create A `LayerMap` Service That Provides A Dynamic Set Of Resources Based On A Key. ```Ts Import { NodeRuntime } From "@Effect/Platform-Node" Import { Context, Effect, FiberRef, Layer, LayerMap } From "Effect" Class Greeter Extends Context.Tag("Greeter")<Greeter, { Greet: Effect.Effect<String> }>() {} // Create A Service That Wraps A LayerMap Class GreeterMap Extends LayerMap.Service<GreeterMap>()("GreeterMap", { // Define The Lookup Function For The Layer Map // // The Returned Layer Will Be Used To Provide The Greeter Service For The // Given Name. Lookup: (Name: String) => Layer.Succeed(Greeter, { Greet: Effect.Succeed(`Hello, ${Name}!`) }).Pipe( Layer.Merge(Layer.LocallyScoped(FiberRef.CurrentConcurrency, 123)) ), // If A Layer Is Not Used For A Certain Amount Of Time, It Can Be Removed IdleTimeToLive: "5 Seconds", // Supply The Dependencies For The Layers In The LayerMap Dependencies: [] }) {} // Usage Const Program: Effect.Effect<Void, Never, GreeterMap> = Effect.Gen(Function*() { // Access And Use The Greeter Service Const Greeter = Yield* Greeter Yield* Effect.Log(Yield* Greeter.Greet) }).Pipe( // Use The GreeterMap Service To Provide A Variant Of The Greeter Service Effect.Provide(GreeterMap.Get("John")) ) // Run The Program Program.Pipe( Effect.Provide(GreeterMap.Default), NodeRuntime.RunMain ) ```
Signature
declare function Service<Self>(): <Id extends string, Options extends NoExcessProperties<{ readonly dependencies?: readonly Array<Layer<any, any, any>>; readonly idleTimeToLive?: DurationInput; readonly lookup: (key: any) => Layer<any, any, any>; readonly preloadKeys?: Iterable<Options extends { readonly lookup: (key: K) => any; } ? K : never, any, any>;}, Options> | NoExcessProperties<{ readonly dependencies?: readonly Array<Layer<any, any, any>>; readonly idleTimeToLive?: DurationInput; readonly layers: Record<string, Layer.Layer<any, any, any>>; readonly preload?: boolean;}, Options>>(id: Id, options: Options) => TagClass<Self, Id, Options extends { readonly lookup: (key: K) => any;} ? K : Options extends { readonly layers: Layers;} ? keyof Layers : never, Success<Options>, Options extends { readonly preload: true;} ? never : Error<Options>, Context<Options>, Options extends { readonly preload: true;} ? Error<Options> : Options extends { readonly preloadKey: Iterable<any>;} ? Error<Options> : never, Options extends { readonly dependencies: readonly Array<any>;} ? Options["dependencies"][number] : never>