From 6b0fa399d50c3b43fd2f1ae5420991d258a55fc9 Mon Sep 17 00:00:00 2001 From: Leo Horie Date: Wed, 10 Aug 2016 13:53:05 -0400 Subject: [PATCH] rebuild after stream changes --- mithril.js | 56 ++++++++++++++++++----------------- mithril.min.js | 80 +++++++++++++++++++++++++------------------------- util/stream.js | 2 +- 3 files changed, 70 insertions(+), 68 deletions(-) diff --git a/mithril.js b/mithril.js index 9c83ef6b..f8a3e3d5 100644 --- a/mithril.js +++ b/mithril.js @@ -49,15 +49,7 @@ function updateStream(stream, value, error) { function updateState(stream, value, error) { error = unwrapError(value, error) if (error !== undefined && typeof stream._state.recover === "function") { - try { - var recovered = stream._state.recover() - if (recovered === HALT) return - updateValues(stream, recovered, undefined) - } - catch (e) { - updateValues(stream, undefined, e) - reportUncaughtError(stream, e) - } + if (!resolve(stream, updateValues, true)) return } else updateValues(stream, value, error) stream._state.changed = true @@ -72,19 +64,21 @@ function updateDependency(stream, mustSync) { if (parents.length > 0 && parents.filter(active).length === parents.length && (mustSync || parents.filter(changed).length > 0)) { var failed = parents.filter(errored) if (failed.length > 0) updateState(stream, undefined, failed[0]._state.error) - else { - try { - var value = state.derive() - if (value === HALT) return - updateState(stream, value, undefined) - } - catch (e) { - updateState(stream, undefined, e) - reportUncaughtError(stream, e) - } - } + else resolve(stream, updateState, false) } } +function resolve(stream, update, shouldRecover) { + try { + var value = shouldRecover ? stream._state.recover() : stream._state.derive() + if (value === HALT) return false + update(stream, value, undefined) + } + catch (e) { + update(stream, undefined, e) + reportUncaughtError(stream, e) + } + return true +} function unwrapError(value, error) { if (value != null && value.constructor === createStream) { if (value._state.error !== undefined) error = value._state.error @@ -97,7 +91,7 @@ function finalize(stream) { for (var id in stream._state.deps) stream._state.deps[id]._state.changed = false } function reportUncaughtError(stream, e) { - if (Object.keys(stream._state.deps).length === 0) { + if (Object.keys(stream._state.deps).length === 0 && stream._state.derive == null) { setTimeout(function() { if (Object.keys(stream._state.deps).length === 0) console.error(e) }, 0) @@ -124,11 +118,19 @@ function combine(fn, streams) { } function absorb(stream, value) { if (value != null && value.constructor === createStream) { - value.error.map(stream.error) - value.map(stream) - if (value._state.state === 0) return HALT - if (value._state.error) throw value._state.error - value = value._state.value + var absorbable = value + var update = function() { + updateState(stream, absorbable._state.value, absorbable._state.error) + for (var id in stream._state.deps) updateDependency(stream._state.deps[id], false) + } + absorbable.map(update).catch(function(e) { + update() + throw e + }) + + if (absorbable._state.state === 0) return HALT + if (absorbable._state.error) throw absorbable._state.error + value = absorbable._state.value } return value } @@ -175,7 +177,7 @@ function reject(e) { } function merge(streams) { return combine(function () { - return streams.map(function (s) {return s()}) + return streams.map(function(s) {return s()}) }, streams) } var Stream = {stream: createStream, merge: merge, combine: combine, reject: reject, HALT: HALT} diff --git a/mithril.min.js b/mithril.min.js index 56430b46..683fc863 100644 --- a/mithril.min.js +++ b/mithril.min.js @@ -1,40 +1,40 @@ -new function(){function y(){function a(){0=r&&B>=A;){var t=c[r],w=e[A];if(t===w)r++,A++;else if(null!=t&&null!=w&&t.key===w.key)r++,A++,p(a,t,w,d,m(c,r,g),z,k),z&&t.tag===w.tag&&f(a,l(t),g);else if(t=c[v],t===w)v--,A++;else if(null!=t&&null!=w&&t.key===w.key)p(a,t,w,d,m(c,v+1,g),z,k),f(a,l(t),m(c,r,g)),v--,A++;else break}for(;v>= -r&&B>=A;){t=c[v];w=e[B];if(t===w)v--;else if(null!=t&&null!=w&&t.key===w.key)p(a,t,w,d,m(c,v+1,g),z,k),z&&t.tag===w.tag&&f(a,l(t),g),null!=t.dom&&(g=t.dom),v--;else{if(!u){u=c;var t=v,n={},x;for(x=0;xa.indexOf("?")?"?":"&";a+=g+d}return a}function d(a){try{return""!==a?JSON.parse(a):null}catch(b){throw Error(a);}}function g(a){return a.responseText}function p(a,b){if("function"===typeof a)if(b instanceof Array)for(var d=0;dk.status)q(p(f.type,a));else{var b=Error(k.responseText),d;for(d in a)b[d]=a[d];q.error(b)}}catch(h){q.error(h)}"function"===typeof m&&m()}};l?k.send(f.data):k.send();return q},jsonp:function(f){var d=C.stream();void 0!==f.initialValue&&d(f.initialValue);var g=f.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+l++,k=a.document.createElement("script");a[g]=function(b){k.parentNode.removeChild(k);d(p(f.type,b));"function"===typeof m&&m();delete a[g]};k.onerror= -function(){k.parentNode.removeChild(k);d.error(Error("JSONP request failed"));"function"===typeof m&&m();delete a[g]};null==f.data&&(f.data={});f.url=b(f.url,f.data);f.data[f.callbackKey||"callback"]=g;k.src=h(f.url,f.data);a.document.documentElement.appendChild(k);return d},setCompletionCallback:function(a){m=a}}}(window),H=function(){var a=[];return{subscribe:a.push.bind(a),unsubscribe:function(b){b=a.indexOf(b);-1=r&&B>=A;){var t=c[r],w=f[A];if(t===w)r++,A++;else if(null!=t&&null!=w&&t.key===w.key)r++,A++,q(a,t,w,e,m(c,r,h),z,k),z&&t.tag===w.tag&&g(a,l(t),h);else if(t=c[v],t===w)v--,A++;else if(null!= +t&&null!=w&&t.key===w.key)q(a,t,w,e,m(c,v+1,h),z,k),g(a,l(t),m(c,r,h)),v--,A++;else break}for(;v>=r&&B>=A;){t=c[v];w=f[B];if(t===w)v--;else if(null!=t&&null!=w&&t.key===w.key)q(a,t,w,e,m(c,v+1,h),z,k),z&&t.tag===w.tag&&g(a,l(t),h),null!=t.dom&&(h=t.dom),v--;else{if(!u){u=c;var t=v,n={},x;for(x=0;xa.indexOf("?")?"?":"&";a+=h+d}return a}function e(a){try{return""!==a?JSON.parse(a):null}catch(b){throw Error(a);}}function k(a){return a.responseText}function q(a,b){if("function"===typeof a)if(b instanceof Array)for(var d= +0;dh.status)p(q(g.type,a));else{var b=Error(h.responseText),d;for(d in a)b[d]=a[d];p.error(b)}}catch(e){p.error(e)}"function"===typeof m&&m()}};l?h.send(g.data):h.send();return p},jsonp:function(g){var e=C.stream();void 0!==g.initialValue&&e(g.initialValue);var k=g.callbackName||"_mithril_"+Math.round(1E16*Math.random())+"_"+l++,h=a.document.createElement("script");a[k]=function(b){h.parentNode.removeChild(h);e(q(g.type, +b));"function"===typeof m&&m();delete a[k]};h.onerror=function(){h.parentNode.removeChild(h);e.error(Error("JSONP request failed"));"function"===typeof m&&m();delete a[k]};null==g.data&&(g.data={});g.url=b(g.url,g.data);g.data[g.callbackKey||"callback"]=k;h.src=d(g.url,g.data);a.document.documentElement.appendChild(h);return e},setCompletionCallback:function(a){m=a}}}(window),G=function(){var a=[];return{subscribe:a.push.bind(a),unsubscribe:function(b){b=a.indexOf(b);-1