@@ -250,74 +250,51 @@ export function spread(node, accessor) {
250250
251251export 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
285273export 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