Skip to content

Commit 784bb73

Browse files
committed
simplify when flows
1 parent 4c1eb15 commit 784bb73

4 files changed

Lines changed: 32 additions & 50 deletions

File tree

dom-expressions.config.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,14 @@ module.exports = {
33
variables: {
44
imports: [ `import {
55
comp as wrap, sample, root, cleanup, getContextOwner as currentContext,
6-
setContext, makeDataNode
6+
setContext, makeDataNode, value
77
} from '@ryansolid/s-js'` ],
88
declarations: {
9+
memo: `(fn) => {
10+
const s = value(fn());
11+
wrap(() => s(fn()));
12+
return s;
13+
}`,
914
SuspenseContext: `{
1015
id: 'suspense', initFn: () => {
1116
let counter = 0;

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "dom-expressions",
33
"description": "A Fine-Grained Runtime for Performant DOM Rendering",
4-
"version": "0.9.10",
4+
"version": "0.10.0",
55
"author": "Ryan Carniato",
66
"license": "MIT",
77
"repository": {
@@ -24,7 +24,7 @@
2424
"devDependencies": {
2525
"@babel/core": "7.4.5",
2626
"@babel/preset-env": "^7.4.5",
27-
"babel-plugin-jsx-dom-expressions": "0.9.13",
27+
"babel-plugin-jsx-dom-expressions": "0.10.0",
2828
"coveralls": "3.0.4",
2929
"jest": "24.8.0",
3030
"@ryansolid/s-js": "~0.4.14"

template/runtime.ejs

Lines changed: 20 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -250,74 +250,51 @@ export function spread(node, accessor) {
250250

251251
export function when(parent, accessor, expr, options, marker) {
252252
let beforeNode, current, disposable;
253-
const { afterRender, fallback } = options;
253+
const { afterRender, fallback } = options,
254+
condition = memo(accessor);
254255

255256
if (marker !== undefined) beforeNode = marker ? marker.previousSibling : parent.lastChild;
256-
cleanup(function dispose() { disposable && disposable(); });
257-
258-
wrap(cached => {
259-
const value = accessor();
260-
if (value === cached) return cached;
261-
return sample(() => {
257+
wrap(() => {
258+
const value = condition();
259+
sample(() => {
262260
parent = (marker && marker.parentNode) || (beforeNode && beforeNode.parentNode) || parent;
263-
disposable && disposable();
264261
clearAll(parent, current, marker, beforeNode && beforeNode.nextSibling);
265262
current = null;
266263
if (value == null || value === false) {
267264
afterRender && afterRender(current, marker);
268265
if (fallback) {
269-
root(disposer => {
270-
disposable = disposer;
271-
addNode(parent, fallback(), marker, ++groupCounter, node => current = node);
272-
});
266+
addNode(parent, fallback(), marker, ++groupCounter, node => current = node);
273267
}
274-
} else {
275-
root(disposer => {
276-
disposable = disposer;
277-
addNode(parent, expr(value), marker, ++groupCounter, node => current = node, afterRender && afterRender(node, marker));
278-
});
279-
}
280-
return value;
268+
} else addNode(parent, expr(value), marker, ++groupCounter, node => (current = node, afterRender && afterRender(node, marker)));
281269
});
282270
});
283271
}
284272

285273
export function switchWhen(parent, conditions, _, options, marker) {
286274
let beforeNode, current, disposable;
287-
const { fallback } = options;
275+
const { fallback } = options,
276+
evalConditions = memo(() => {
277+
for (let i = 0; i < conditions.length; i++) {
278+
if (conditions[i].condition()) return i;
279+
}
280+
return -1;
281+
});
288282

289283
if (marker !== undefined) beforeNode = marker ? marker.previousSibling : parent.lastChild;
290-
function evalConditions() {
291-
for (let i = 0; i < conditions.length; i++) {
292-
if (conditions[i].condition()) return {index: i, render: conditions[i].render, afterRender: conditions[i].options && conditions[i].options.afterRender};
293-
}
294-
return {index: -1};
295-
}
296-
cleanup(function dispose() { disposable && disposable(); });
297-
298-
wrap(cached => {
299-
const {index, render, afterRender} = evalConditions();
300-
if (index === cached) return cached;
301-
return sample(() => {
284+
wrap(() => {
285+
const index = evalConditions();
286+
sample(() => {
302287
parent = (marker && marker.parentNode) || (beforeNode && beforeNode.parentNode) || parent;
303-
disposable && disposable();
304288
clearAll(parent, current, marker, beforeNode && beforeNode.nextSibling);
305289
current = null;
306290
if (index < 0) {
307-
afterRender && afterRender(null, marker);
308291
if (fallback) {
309-
root(disposer => {
310-
disposable = disposer;
311-
addNode(parent, fallback(), marker, ++groupCounter, node => current = node);
312-
});
292+
addNode(parent, fallback(), marker, ++groupCounter, node => current = node);
313293
}
314294
} else {
315-
root(disposer => {
316-
disposable = disposer;
317-
addNode(parent, render(), marker, ++groupCounter, node => current = node, afterRender && afterRender(node, marker));
318-
});
295+
const afterRender = conditions[index].options && conditions[index].options.afterRender;
296+
addNode(parent, conditions[index].render(), marker, ++groupCounter, node => current = node, afterRender && afterRender(node, marker));
319297
}
320-
return index;
321298
});
322299
});
323300
}

0 commit comments

Comments
 (0)