This commit is contained in:
eewing
2026-02-17 14:10:16 -06:00
parent 2bca5834c5
commit cf73cd3b4c
11246 changed files with 1690552 additions and 0 deletions
+14
View File
@@ -0,0 +1,14 @@
import type { Box } from "../types.js";
type WatcherCallback<T> = (curr: T, prev: T) => void | Promise<void> | (() => void) | (() => Promise<void>);
type WatchOptions = {
/**
* Whether to eagerly run the watcher before the state is updated.
*/
immediate?: boolean;
/**
* Whether to run the watcher only once.
*/
once?: boolean;
};
export declare function watch<T>(box: Box<T>, callback: WatcherCallback<T>, options?: WatchOptions): () => void;
export {};
+26
View File
@@ -0,0 +1,26 @@
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;
}