-
Notifications
You must be signed in to change notification settings - Fork 11
/
Copy pathvalue.js
49 lines (40 loc) · 982 Bytes
/
value.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
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
}