| 1 | import * as Effect from "effect/Effect"; |
| 2 | import * as References from "effect/References"; |
| 3 | |
| 4 | const snapshotStack = ( |
| 5 | frame: References.StackFrame | undefined, |
| 6 | ): References.StackFrame | undefined => { |
| 7 | if (frame === undefined) return undefined; |
| 8 | const stack = frame.stack(); |
| 9 | return { name: frame.name, stack: () => stack, parent: snapshotStack(frame.parent) }; |
| 10 | }; |
| 11 | |
| 12 | /** |
| 13 | * Wrap a `Cache.get` so its lookup fiber inherits a materialized stack. The lazy |
| 14 | * caller frame would otherwise retain the caller's request snapshot for the TTL. |
| 15 | */ |
| 16 | export const detachStackFrame = <A, E, R>(effect: Effect.Effect<A, E, R>) => |
| 17 | Effect.gen(function* () { |
| 18 | const frame = snapshotStack(yield* References.CurrentStackFrame); |
| 19 | return yield* Effect.provideService(effect, References.CurrentStackFrame, frame); |
| 20 | }); |