mutant
Version:
Create observables and map them to DOM elements. Massively inspired by hyperscript and observ-*. No virtual dom, just direct observable bindings. Unnecessary garbage collection is avoided by using mutable objects instead of blasting immutable junk all ove
50 lines (40 loc) • 982 B
JavaScript
module.exports = Observable
function Observable (value, opts) {
var listeners = []
value = getValue(value, opts)
observable.set = function (v) {
value = getValue(v, opts)
var cachedListeners = listeners.slice(0)
for (var i = 0, len = cachedListeners.length; i < len; i++) {
cachedListeners[i](value)
}
}
return observable
function observable (listener) {
if (!listener) {
return value
}
if (typeof listener !== 'function') {
throw new Error('Listeners must be functions.')
}
listeners.push(listener)
return function remove () {
for (var i = 0, len = listeners.length; i < len; i++) {
if (listeners[i] === listener) {
listeners.splice(i, 1)
break
}
}
}
}
}
function getValue (value, opts) {
if (value == null) {
if (opts && opts.defaultValue != null) {
value = opts.defaultValue
} else {
value = null
}
}
return value
}