From 8215d60f8e26fadbb96c6ca03973fd47f7a7eb28 Mon Sep 17 00:00:00 2001 From: ivar Date: Tue, 2 Dec 2025 18:46:19 +0100 Subject: Init --- index.js | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 index.js diff --git a/index.js b/index.js new file mode 100644 index 0000000..e98a636 --- /dev/null +++ b/index.js @@ -0,0 +1,61 @@ +// Credit Ryan Carniato https://frontendmasters.com/courses/reactivity-solidjs/ + +let context = []; + +export function untrack(fn) { + const prevContext = context; + context = []; + const res = fn(); + context = prevContext; + return res; +} + +function cleanup(observer) { + for (const dep of observer.dependencies) { + dep.delete(observer); + } + observer.dependencies.clear(); +} + +function subscribe(observer, subscriptions) { + subscriptions.add(observer); + observer.dependencies.add(subscriptions); +} + +export function createSignal(value) { + const subscriptions = new Set(); + + const read = () => { + const observer = context[context.length - 1] + if (observer) subscribe(observer, subscriptions); + return value; + } + const write = (newValue) => { + value = newValue; + for (const observer of [...subscriptions]) { + observer.execute(); + } + } + + return [read, write]; +} + +export function createEffect(fn) { + const effect = { + execute() { + cleanup(effect); + context.push(effect); + fn(); + context.pop(); + }, + dependencies: new Set() + } + + effect.execute(); +} + +export function createMemo(fn) { + const [signal, setSignal] = createSignal(); + createEffect(() => setSignal(fn())); + return signal; +} -- cgit v1.3