Something went wrong. Try again.
Experiment to rebuild Diffuse using web applets.
Something went wrong. Try again.
1.2 kB · 65 lines
TypeScript
at main
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566import { Signal } from "signal-polyfill";
// SIGNAL
export type Signal<T> = () => T;
export const signal = <T>(initial: T): [Signal<T>, (value: T) => void] => { const state = new Signal.State(initial); const get = () => state.get(); const set = (value: T) => state.set(value); return [get, set];};
// EFFECT
export const throttled = ( job: () => void, queue: (callback: () => void) => void = queueMicrotask,): (() => void) => { let isScheduled = false;
const perform = () => { job(); isScheduled = false; };
const schedule = () => { if (!isScheduled) { isScheduled = true; queue(perform); } };
return schedule;};
const watcher = new Signal.subtle.Watcher( throttled(() => { for (const signal of watcher.getPending()) { signal.get(); } watcher.watch(); }),);
export type Cancel = () => void;
export const effect = (perform: () => Cancel | void) => { let cleanup: Cancel | undefined;
const signal = new Signal.Computed(() => { cleanup?.(); cleanup = perform() ?? undefined; });
watcher.watch(signal); signal.get();
const dispose = () => { cleanup?.(); watcher.unwatch(signal); };
return dispose;};