Skip to content

Commit 0c8aaca

Browse files
committed
Merge branch 'main' of https://github.com/efflore/ui-element into main
2 parents 5ef1cb9 + b2dc0a2 commit 0c8aaca

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

42 files changed

+1523
-915
lines changed

README.md

Lines changed: 111 additions & 73 deletions
Large diffs are not rendered by default.

cause-effect.js

Lines changed: 31 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,15 @@
22
/* === Internal === */
33
// hold the currently active effect
44
let active;
5+
/**
6+
* Run all effects in the provided set
7+
*
8+
* @param {Set<UIEffects>} effects
9+
*/
10+
const autorun = (effects) => {
11+
for (const effect of effects)
12+
effect.run();
13+
};
514
/* === Exported functions === */
615
/**
716
* Check if a given variable is a function
@@ -35,10 +44,7 @@ const cause = (value) => {
3544
value = isFunction(updater) && !isState(updater)
3645
? updater(old)
3746
: updater;
38-
if (!Object.is(value, old)) {
39-
for (const effect of state.effects)
40-
effect();
41-
}
47+
!Object.is(value, old) && autorun(state.effects);
4248
};
4349
return state;
4450
};
@@ -47,16 +53,28 @@ const cause = (value) => {
4753
*
4854
* @since 0.1.0
4955
* @param {() => any} fn - existing state to derive from
50-
* @returns {() => any} derived state
56+
* @param {boolean} [memo=false] - whether to use memoization
57+
* @returns {UIComputed<any>} derived state
5158
*/
52-
const derive = (fn) => {
59+
const derive = (fn, memo = false) => {
60+
let value;
61+
let dirty = true;
5362
const computed = () => {
63+
active && computed.effects.add(active);
64+
if (memo && !dirty)
65+
return value;
5466
const prev = active;
5567
active = computed;
56-
const value = fn();
68+
value = fn();
69+
dirty = false;
5770
active = prev;
5871
return value;
5972
};
73+
computed.effects = new Set(); // set of listeners
74+
computed.run = () => {
75+
dirty = true;
76+
memo && autorun(computed.effects);
77+
};
6078
return computed;
6179
};
6280
/**
@@ -74,15 +92,14 @@ const effect = (fn) => {
7492
!targets.has(element) && targets.set(element, new Set());
7593
targets.get(element).add(domFn);
7694
});
95+
for (const domFns of targets.values()) {
96+
for (const domFn of domFns)
97+
domFn();
98+
}
7799
active = prev;
78-
(targets.size || cleanup) && queueMicrotask(() => {
79-
for (const domFns of targets.values()) {
80-
for (const domFn of domFns)
81-
domFn();
82-
}
83-
isFunction(cleanup) && cleanup();
84-
});
100+
isFunction(cleanup) && queueMicrotask(cleanup);
85101
};
102+
next.run = () => next();
86103
next.targets = targets;
87104
next();
88105
};

cause-effect.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)