Skip to content

Instantly share code, notes, and snippets.

@TehShrike
Created November 2, 2017 15:21
Show Gist options
  • Save TehShrike/8e84b8529d24401d8a368ebb64446114 to your computer and use it in GitHub Desktop.
Save TehShrike/8e84b8529d24401d8a368ebb64446114 to your computer and use it in GitHub Desktop.
PureState
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