<
Node extends AddressedNode<unknown> & {
readonly [catalogSym]?: unknown
},
const Tags extends TagList
>(
node: Node,
tags: TagsForCatalog<Node, Tags>
): Layer.Layer<ServicesOfTags<Tags>>
<
Node extends AddressedNode<unknown> & {
readonly [catalogSym]?: unknown
},
const Tags extends TagList
>(
node: Node,
...tags: TagsForCatalog<Node, Tags>
): Layer.Layer<ServicesOfTags<Tags>>
<const Tags extends TagList>(tags: Tags): Layer.Layer<
ServicesOfTags<Tags>,
UnaddressedNode | ClientsNodeMismatch
>
<const Tags extends TagList>(...tags: Tags): Layer.Layer<
ServicesOfTags<Tags>,
UnaddressedNode | ClientsNodeMismatch
>Client layers for a catalog node's ROut (C2) — one shared connect, no repeated
node on each client line.
Node.clients(Worker, [Jobs, Emails])
Node.clients(Worker, Jobs, Emails)
Node.clients([Jobs, Emails]) // each tag carries Worker via andNode / { node }
Node.clients(Jobs, Emails)export function function clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>> (+3 overloads)Client layers for a catalog node's ROut (C2) — one shared
connect
, no repeated
node on each client line.
Node.clients(Worker, [Jobs, Emails])
Node.clients(Worker, Jobs, Emails)
Node.clients([Jobs, Emails]) // each tag carries Worker via andNode / { node }
Node.clients(Jobs, Emails)
clients<
function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node extends import AddressedNodeAddressedNode<unknown> & {
readonly [import catalogSymcatalogSym]?: unknown;
},
const function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags extends type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList,
>(
node: Node extends AddressedNode<unknown> & {}node: function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node,
tags: TagsForCatalog<Node, Tags>tags: type TagsForCatalog<
Node,
Tags extends TagList
> = [CatalogROut<Node>] extends [
ServicesOfTags<Tags>
]
? Tags
: never
Tags that cover a catalog node's ROut (C3).
TagsForCatalog<function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node, function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags>,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<type ServicesOfTags<
Tags extends ReadonlyArray<Hyperlink.PipeableTag>
> = Tags[number] extends Context.Key<infer S, any>
? S
: never
Union of Tag Self identifiers from a
clients
tag list.
Shallow
Hyperlink.PipeableTag
only — HyperlinkTag<…> here reopens TS2589 under stock tsc.
ServicesOfTags<function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags>>;
export function function clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>> (+3 overloads)Client layers for a catalog node's ROut (C2) — one shared
connect
, no repeated
node on each client line.
Node.clients(Worker, [Jobs, Emails])
Node.clients(Worker, Jobs, Emails)
Node.clients([Jobs, Emails]) // each tag carries Worker via andNode / { node }
Node.clients(Jobs, Emails)
clients<
function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node extends import AddressedNodeAddressedNode<unknown> & {
readonly [import catalogSymcatalogSym]?: unknown;
},
const function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags extends type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList,
>(
node: Node extends AddressedNode<unknown> & {}node: function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node,
...tags: TagsForCatalog<Node, Tags>tags: type TagsForCatalog<
Node,
Tags extends TagList
> = [CatalogROut<Node>] extends [
ServicesOfTags<Tags>
]
? Tags
: never
Tags that cover a catalog node's ROut (C3).
TagsForCatalog<function (type parameter) Node in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Node, function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags>
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<type ServicesOfTags<
Tags extends ReadonlyArray<Hyperlink.PipeableTag>
> = Tags[number] extends Context.Key<infer S, any>
? S
: never
Union of Tag Self identifiers from a
clients
tag list.
Shallow
Hyperlink.PipeableTag
only — HyperlinkTag<…> here reopens TS2589 under stock tsc.
ServicesOfTags<function (type parameter) Tags in clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, ...tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>>Tags>>;
/** Bound tags — node from each tag's `andNode` / `{ node }` (array form). */
export function function clients<const Tags extends TagList>(tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch> (+3 overloads)Bound tags — node from each tag's andNode / { node } (array form).
clients<const function (type parameter) Tags in clients<const Tags extends TagList>(tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags extends type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList>(
tags: const Tags extends TagListtags: function (type parameter) Tags in clients<const Tags extends TagList>(tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags,
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<type ServicesOfTags<
Tags extends ReadonlyArray<Hyperlink.PipeableTag>
> = Tags[number] extends Context.Key<infer S, any>
? S
: never
Union of Tag Self identifiers from a
clients
tag list.
Shallow
Hyperlink.PipeableTag
only — HyperlinkTag<…> here reopens TS2589 under stock tsc.
ServicesOfTags<function (type parameter) Tags in clients<const Tags extends TagList>(tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags>, import UnaddressedNodeUnaddressedNode | class ClientsNodeMismatchclass ClientsNodeMismatch {
name: string;
message: string;
stack: string;
cause: unknown;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
_tag: Tag;
tags: ReadonlyArray<string>;
}
clients
got bound tags that do not share one
AddressedNode
.
ClientsNodeMismatch>;
/** Bound tags — rest form. */
export function function clients<const Tags extends TagList>(...tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch> (+3 overloads)Bound tags — rest form.
clients<const function (type parameter) Tags in clients<const Tags extends TagList>(...tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags extends type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList>(
...tags: const Tags extends TagListtags: function (type parameter) Tags in clients<const Tags extends TagList>(...tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<type ServicesOfTags<
Tags extends ReadonlyArray<Hyperlink.PipeableTag>
> = Tags[number] extends Context.Key<infer S, any>
? S
: never
Union of Tag Self identifiers from a
clients
tag list.
Shallow
Hyperlink.PipeableTag
only — HyperlinkTag<…> here reopens TS2589 under stock tsc.
ServicesOfTags<function (type parameter) Tags in clients<const Tags extends TagList>(...tags: Tags): Layer.Layer<ServicesOfTags<Tags>, UnaddressedNode | ClientsNodeMismatch>Tags>, import UnaddressedNodeUnaddressedNode | class ClientsNodeMismatchclass ClientsNodeMismatch {
name: string;
message: string;
stack: string;
cause: unknown;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
_tag: Tag;
tags: ReadonlyArray<string>;
}
clients
got bound tags that do not share one
AddressedNode
.
ClientsNodeMismatch>;
export function function clients<Node extends AddressedNode<unknown> & {}, const Tags extends TagList>(node: Node, tags: TagsForCatalog<Node, Tags>): Layer.Layer<ServicesOfTags<Tags>> (+3 overloads)Client layers for a catalog node's ROut (C2) — one shared
connect
, no repeated
node on each client line.
Node.clients(Worker, [Jobs, Emails])
Node.clients(Worker, Jobs, Emails)
Node.clients([Jobs, Emails]) // each tag carries Worker via andNode / { node }
Node.clients(Jobs, Emails)
clients(
first: unknownfirst: unknown,
second: unknownsecond?: unknown,
...rest: readonly unknown[]rest: interface ReadonlyArray<T>ReadonlyArray<unknown>
): import LayerLayer.interface Layer<in ROut, out E = never, out RIn = never>A Layer describes how to build one or more services for dependency injection.
When to use
Use to model construction of application services for dependency injection,
especially when services have dependencies, can fail during construction, or
need scoped setup and release.
Details
A Layer<ROut, E, RIn> represents ROut as the services this layer
provides, E as the possible errors during layer construction, and RIn as
the services this layer requires as dependencies.
Layer<never, import UnaddressedNodeUnaddressedNode | class ClientsNodeMismatchclass ClientsNodeMismatch {
name: string;
message: string;
stack: string;
cause: unknown;
pipe: { <A>(this: A): A; <A, B = never>(this: A, ab: (_: A) => B): B; <A, B = never, C = never>(this: A, ab: (_: A) => B, bc: (_: B) => C): C; <A, B = never, C = never, D = never>(this: A, ab: (_: A) => B, bc: (_: B) => C, cd: (_: C) => D): D; <…;
toString: () => string;
toJSON: () => unknown;
_tag: Tag;
tags: ReadonlyArray<string>;
}
clients
got bound tags that do not share one
AddressedNode
.
ClientsNodeMismatch> {
const const addressed: anyaddressed = const asAddressed: (
node: unknown
) => AddressedNode<unknown> | undefined
asAddressed(first: unknownfirst);
if (const addressed: anyaddressed !== var undefinedundefined) {
const const tags: readonly Hyperlink.PipeableTag[]tags: interface ReadonlyArray<T>ReadonlyArray<import HyperlinkHyperlink.type Hyperlink.PipeableTag = /*unresolved*/ anyPipeableTag> = const isTagList: (
value: unknown
) => value is TagList
isTagList(second: unknownsecond)
? second: readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
(parameter) second: {
0: Hyperlink.PipeableTag;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<any>>): Array<any>; (...items: Array<any>): Array<any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<any>;
indexOf: (searchElement: any, fromIndex?: number) => number;
lastIndexOf: (searchElement: any, fromIndex?: number) => number;
every: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): boolean };
some: (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: any, index: number, array: ReadonlyArray<any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: any, index: number, array: ReadonlyArray<any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): Array<any> };
reduce: { (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any): any; (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any, initialValu…;
reduceRight: { (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any): any; (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any, initialValu…;
find: { (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => unknown, thisArg?: any): any };
findIndex: (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<any>;
includes: (searchElement: any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: any, index: number, array: Array<any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => any;
findLast: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): any };
findLastIndex: (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<any>;
toSorted: (compareFn?: ((a: any, b: any) => number) | undefined) => Array<any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<any>): Array<any>; (start: number, deleteCount?: number): Array<any> };
with: (index: number, value: any) => Array<any>;
}
second
: second: unknownsecond !== var undefinedundefined
? ([second: {} | nullsecond, ...rest: readonly unknown[]rest] as unknown as type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList)
: [];
return const mergeClientLayers: (
node: AddressedNode<unknown>,
tags: ReadonlyArray<Hyperlink.PipeableTag>
) => Layer.Layer<never>
mergeClientLayers(const addressed: anyaddressed, const tags: readonly Hyperlink.PipeableTag[]tags);
}
const const tags: readonly Hyperlink.PipeableTag[]tags: interface ReadonlyArray<T>ReadonlyArray<import HyperlinkHyperlink.type Hyperlink.PipeableTag = /*unresolved*/ anyPipeableTag> = const isTagList: (
value: unknown
) => value is TagList
isTagList(first: unknownfirst)
? first: readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
(parameter) first: {
0: Hyperlink.PipeableTag;
length: number;
toString: () => string;
toLocaleString: { (): string; (locales: string | string[], options?: Intl.NumberFormatOptions & Intl.DateTimeFormatOptions): string };
concat: { (...items: Array<ConcatArray<any>>): Array<any>; (...items: Array<any>): Array<any> };
join: (separator?: string) => string;
slice: (start?: number, end?: number) => Array<any>;
indexOf: (searchElement: any, fromIndex?: number) => number;
lastIndexOf: (searchElement: any, fromIndex?: number) => number;
every: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): this is readonly S[]; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): boolean };
some: (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any) => boolean;
forEach: (callbackfn: (value: any, index: number, array: ReadonlyArray<any>) => void, thisArg?: any) => void;
map: (callbackfn: (value: any, index: number, array: ReadonlyArray<any>) => U, thisArg?: any) => Array<U>;
filter: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): Array<S>; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): Array<any> };
reduce: { (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any): any; (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any, initialValu…;
reduceRight: { (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any): any; (callbackfn: (previousValue: any, currentValue: any, currentIndex: number, array: ReadonlyArray<any>) => any, initialValu…;
find: { (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => unknown, thisArg?: any): any };
findIndex: (predicate: (value: any, index: number, obj: ReadonlyArray<any>) => unknown, thisArg?: any) => number;
entries: () => ArrayIterator<[number, any]>;
keys: () => ArrayIterator<number>;
values: () => ArrayIterator<any>;
includes: (searchElement: any, fromIndex?: number) => boolean;
flatMap: (callback: (this: This, value: any, index: number, array: Array<any>) => U | ReadonlyArray<U>, thisArg?: This | undefined) => Array<U>;
flat: (this: A, depth?: D | undefined) => Array<FlatArray<A, D>>;
at: (index: number) => any;
findLast: { (predicate: (value: any, index: number, array: ReadonlyArray<any>) => value is S, thisArg?: any): S | undefined; (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any): any };
findLastIndex: (predicate: (value: any, index: number, array: ReadonlyArray<any>) => unknown, thisArg?: any) => number;
toReversed: () => Array<any>;
toSorted: (compareFn?: ((a: any, b: any) => number) | undefined) => Array<any>;
toSpliced: { (start: number, deleteCount: number, ...items: Array<any>): Array<any>; (start: number, deleteCount?: number): Array<any> };
with: (index: number, value: any) => Array<any>;
}
first
: second: unknownsecond !== var undefinedundefined
? ([first: unknownfirst, second: {} | nullsecond, ...rest: readonly unknown[]rest] as unknown as type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList)
: ([first: unknownfirst] as unknown as type TagList = readonly [
Hyperlink.PipeableTag,
...Hyperlink.PipeableTag[]
]
Non-empty tag list for
clients
.
TagList);
return const clientsFromBoundTags: (
tags: ReadonlyArray<Hyperlink.PipeableTag>
) => Layer.Layer<
never,
UnaddressedNode | ClientsNodeMismatch
>
clientsFromBoundTags(const tags: readonly Hyperlink.PipeableTag[]tags);
}