27 lines
866 B
JavaScript
27 lines
866 B
JavaScript
import { untrack } from "svelte";
|
|
export function watch(box, callback, options = {}) {
|
|
let prev = $state(box.current);
|
|
let ranOnce = false;
|
|
const watchEffect = $effect.root(() => {
|
|
$effect.pre(() => {
|
|
if (prev === box.current || !options.immediate)
|
|
return;
|
|
if (options.once && ranOnce)
|
|
return;
|
|
callback(box.current, untrack(() => prev));
|
|
untrack(() => (prev = box.current));
|
|
ranOnce = true;
|
|
});
|
|
$effect(() => {
|
|
if (prev === box.current || options.immediate)
|
|
return;
|
|
if (options.once && ranOnce)
|
|
return;
|
|
callback(box.current, untrack(() => prev));
|
|
untrack(() => (prev = box.current));
|
|
ranOnce = true;
|
|
});
|
|
});
|
|
return watchEffect;
|
|
}
|