Created
November 2, 2017 15:21
-
-
Save TehShrike/8e84b8529d24401d8a368ebb64446114 to your computer and use it in GitHub Desktop.
PureState
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
let captured_deps = [] | |
let capturing_deps = false | |
function refresh(node){ | |
const depended_values = [] | |
for (let i = 0; i < node.dependencies.length; ++i) { | |
depended_values.push(node.dependencies[i].value) | |
} | |
node.value = node.compute.apply(null, depended_values) | |
for (let i = 0; i < node.depended_by.length; ++i) { | |
refresh(node.depended_by[i]) | |
} | |
} | |
module.exports = function state(compute){ | |
function wrap_function(compute){ | |
if (typeof compute !== "function") { | |
return function(){ | |
return compute | |
} | |
} else { | |
return compute | |
} | |
} | |
node.compute = wrap_function(compute) | |
function node(new_compute){ | |
if (capturing_deps) { | |
captured_deps.push(node) | |
} | |
if (new_compute !== undefined){ | |
node.compute = wrap_function(new_compute) | |
refresh(node) | |
} | |
return node.value | |
} | |
node.depended_by = [] | |
captured_deps = [] | |
capturing_deps = true | |
node.compute() | |
capturing_deps = false | |
node.dependencies = captured_deps | |
for (let i = 0; i < captured_deps.length; ++i) { | |
captured_deps[i].depended_by.push(node) | |
} | |
refresh(node) | |
return node | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment