Unregister the end streams after their dependents have run fix #1736

This commit is contained in:
Pierre-Yves Gerardy 2017-03-24 14:43:48 +01:00
parent 3578d0ffb3
commit f22f884b1e
3 changed files with 18 additions and 10 deletions

View file

@ -1,6 +1,7 @@
.vscode .vscode
/node_modules /coverage
/examples
/docs/lib /docs/lib
/examples
/mithril.js /mithril.js
/mithril.min.js /mithril.min.js
/node_modules

View file

@ -16,7 +16,7 @@ function createStream() {
} }
function initStream(stream) { function initStream(stream) {
stream.constructor = createStream stream.constructor = createStream
stream._state = {id: guid++, value: undefined, state: 0, derive: undefined, recover: undefined, deps: {}, parents: [], endStream: undefined} stream._state = {id: guid++, value: undefined, state: 0, derive: undefined, recover: undefined, deps: {}, parents: [], endStream: undefined, unregister: undefined}
stream.map = stream["fantasy-land/map"] = map, stream["fantasy-land/ap"] = ap, stream["fantasy-land/of"] = createStream stream.map = stream["fantasy-land/map"] = map, stream["fantasy-land/ap"] = ap, stream["fantasy-land/of"] = createStream
stream.valueOf = valueOf, stream.toJSON = toJSON, stream.toString = valueOf stream.valueOf = valueOf, stream.toJSON = toJSON, stream.toString = valueOf
@ -25,7 +25,10 @@ function initStream(stream) {
if (!stream._state.endStream) { if (!stream._state.endStream) {
var endStream = createStream() var endStream = createStream()
endStream.map(function(value) { endStream.map(function(value) {
if (value === true) unregisterStream(stream), unregisterStream(endStream) if (value === true) {
unregisterStream(stream)
endStream._state.unregister = function(){unregisterStream(endStream)}
}
return value return value
}) })
stream._state.endStream = endStream stream._state.endStream = endStream
@ -37,6 +40,7 @@ function initStream(stream) {
function updateStream(stream, value) { function updateStream(stream, value) {
updateState(stream, value) updateState(stream, value)
for (var id in stream._state.deps) updateDependency(stream._state.deps[id], false) for (var id in stream._state.deps) updateDependency(stream._state.deps[id], false)
if (stream._state.unregister != null) stream._state.unregister()
finalize(stream) finalize(stream)
} }
function updateState(stream, value) { function updateState(stream, value) {

View file

@ -264,13 +264,16 @@ o.spec("stream", function() {
o(doubled()).equals(4) o(doubled()).equals(4)
}) })
o("end stream can be mapped to", function() { o("end stream can be mapped to", function() {
var stream = Stream() var stream = Stream()
var spy = o.spy() var spy = o.spy()
stream.end.map(spy) stream.end.map(spy)
stream.end(true)
o(spy.callCount).equals(1) o(spy.callCount).equals(0)
stream.end(true)
o(spy.callCount).equals(1)
}) })
}) })
o.spec("valueOf", function() { o.spec("valueOf", function() {