rvx
Version:
A signal based rendering library
68 lines • 1.59 kB
JavaScript
import { NOOP } from "./internals/noop.js";
import { TEARDOWN_STACK } from "./internals/teardown-stack.js";
import { useStack } from "./internals/use-stack.js";
function dispose(hooks) {
for (let i = hooks.length - 1; i >= 0; i--) {
hooks[i]();
}
}
export function onLeak(hook) {
if (TEARDOWN_STACK.length > 0) {
throw new Error("G4");
}
TEARDOWN_STACK.push({ push: hook });
}
export function capture(fn) {
const hooks = [];
try {
useStack(TEARDOWN_STACK, hooks, fn);
}
catch (error) {
dispose(hooks);
throw error;
}
const length = hooks.length;
return length === 1
? hooks[0]
: (length === 0 ? NOOP : () => 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);
}
const NOCAPTURE = {
push() {
throw new Error("G0");
},
};
export function nocapture(fn) {
return useStack(TEARDOWN_STACK, NOCAPTURE, 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