MCPcopy Create free account
hub / github.com/anomalyco/opencode / rewriteReplacementDependencies

Function rewriteReplacementDependencies

packages/core/src/effect/layer-node.ts:286–319  ·  view source on GitHub ↗
(root: AnyNode, replacements: ReadonlyMap<string, AnyNode>)

Source from the content-addressed store, hash-verified

284}
285
286function rewriteReplacementDependencies(root: AnyNode, replacements: ReadonlyMap<string, AnyNode>) {
287 if (replacements.size === 0) return root
288 const cache = new Map<AnyNode, AnyNode>()
289 const visiting = new Set<AnyNode>()
290 const stack: AnyNode[] = []
291
292 const recur = (node: AnyNode, isRoot = false): AnyNode => {
293 const target = isRoot ? node : (replacements.get(node.name) ?? node)
294 const cached = cache.get(target)
295 if (cached !== undefined || cache.has(target)) return cached!
296 if (visiting.has(target)) {
297 const start = stack.indexOf(target)
298 throw new Error(
299 `Cycle detected in layer tree: ${[...stack.slice(start), target].map((item) => item.name).join(" -> ")}`,
300 )
301 }
302
303 visiting.add(target)
304 stack.push(target)
305 try {
306 const dependencies = target.dependencies.map((dependency) => recur(dependency))
307 const result = dependencies.every((dependency, index) => dependency === target.dependencies[index])
308 ? target
309 : { ...target, dependencies }
310 cache.set(target, result)
311 return result
312 } finally {
313 stack.pop()
314 visiting.delete(target)
315 }
316 }
317
318 return recur(root, true)
319}
320
321export function hasUnbound(root: Node<unknown, unknown, any>, source: AnyNode): boolean {
322 if (source.kind !== "unbound") throw new Error(`Cannot check non-unbound layer node: ${source.name}`)

Callers 1

replacementMapFromFunction · 0.85

Calls 1

recurFunction · 0.85

Tested by

no test coverage detected