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>