import * as Effect from "effect/Effect";
import * as References from "effect/References";
const snapshotStack = (
frame: References.StackFrame | undefined,
): References.StackFrame | undefined => {
if (frame === undefined) return undefined;
const stack = frame.stack();
return { name: frame.name, stack: () => stack, parent: snapshotStack(frame.parent) };
};
/**
* Wrap a `Cache.get` so its lookup fiber inherits a materialized stack. The lazy
* caller frame would otherwise retain the caller's request snapshot for the TTL.
* Stay untraced so this helper does not introduce another lazy frame to retain.
*/
export const detachStackFrame = Effect.fnUntraced(function* (
effect: Effect.Effect,
) {
const frame = snapshotStack(yield* References.CurrentStackFrame);
return yield* Effect.provideService(effect, References.CurrentStackFrame, frame);
});