observ-node-array
Version:
Populate an observable array from node descriptors.
44 lines (36 loc) • 819 B
JavaScript
module.exports = watchNodeArray
function watchNodeArray(nodeArray, watch){
var listeners = []
if (nodeArray && nodeArray.forEach){
nodeArray.forEach(addListener)
}
if (nodeArray && nodeArray.onUpdate){
nodeArray.onUpdate(function(diff){
var splice = diff.map(getSpliceDiff)
var removed = listeners.splice.apply(listeners, splice)
removed.forEach(invoke)
})
}
return function release(){
listeners.forEach(invoke)
listeners.length = 0
}
// scoped
function getSpliceDiff(val, i){
if (i > 1){
return addListener(val)
} else {
return val
}
}
function addListener(item){
if (typeof item === 'function'){
return watch(item)
} else {
return null
}
}
}
function invoke(fn){
typeof fn === 'function' && fn()
}