( root: Node<A, E, any>, replacements?: ValidReplacements<Items>, )
| 248 | } |
| 249 | |
| 250 | export function compile<A, E, const Items extends Replacements = readonly []>( |
| 251 | root: Node<A, E, any>, |
| 252 | replacements?: ValidReplacements<Items>, |
| 253 | ): Layer.Layer<A, E> { |
| 254 | const replacementMap = replacementMapFrom(replacements) |
| 255 | const cache = new Map<AnyNode, RuntimeLayer>() |
| 256 | const compileNode = (node: AnyNode) => |
| 257 | walk<RuntimeLayer>( |
| 258 | node, |
| 259 | (node, context) => { |
| 260 | if (node.kind === "unbound") throw new Error(`Unbound layer node: ${node.name}`) |
| 261 | const dependencies = node.dependencies.flatMap(flatten).map(context.visit) |
| 262 | const implementation = node.implementation! as RuntimeLayer |
| 263 | return dependencies.length === 0 |
| 264 | ? implementation |
| 265 | : implementation.pipe(Layer.provide(dependencies as [RuntimeLayer, ...RuntimeLayer[]])) |
| 266 | }, |
| 267 | { cache, resolve: (node) => replacementMap.get(node.name) ?? node }, |
| 268 | ) |
| 269 | const layers = flatten(root).map((node) => compileNode(node)) |
| 270 | const layer = layers.reduce<RuntimeLayer>((result, layer) => layer.pipe(Layer.provideMerge(result)), Layer.empty) |
| 271 | return layer as Layer.Layer<A, E> |
| 272 | } |
| 273 | |
| 274 | function replacementMapFrom(replacements?: Replacements) { |
| 275 | return ( |
nothing calls this directly
no test coverage detected