rvx
Version:
A signal based rendering library
52 lines • 1.27 kB
JavaScript
import { NOOP } from "./internals/noop.js";
import { TEARDOWN_STACK, useStack } from "./internals/stacks.js";
import { isolate } from "./isolate.js";
export { onLeak } from "./internals/stacks.js";
function dispose(hooks) {
for (let i = hooks.length - 1; i >= 0; i--) {
hooks[i]();
}
}
export function capture(fn) {
const hooks = [];
try {
useStack(TEARDOWN_STACK, hooks, fn);
}
catch (error) {
isolate(dispose, hooks);
throw error;
}
return hooks.length === 0 ? NOOP : () => isolate(dispose, hooks);
}
export function captureSelf(fn) {
let disposed = false;
let dispose = NOOP;
let value;
dispose = capture(() => {
value = fn(() => {
disposed = true;
dispose();
});
});
if (disposed) {
dispose();
}
return value;
}
export function uncapture(fn) {
return useStack(TEARDOWN_STACK, undefined, fn);
}
export function teardownOnError(fn) {
let value;
teardown(capture(() => {
value = fn();
}));
return value;
}
export function teardown(hook) {
const length = TEARDOWN_STACK.length;
if (length > 0) {
TEARDOWN_STACK[length - 1]?.push(hook);
}
}
//# sourceMappingURL=lifecycle.js.map