blob: e98a636dcf74d057764424ef1618d755d3f8a63d (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
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;
}
|