1 | var LazyWatcher = require('./lib/lazy-watcher')
|
2 | var resolve = require('./resolve')
|
3 | var isObservable = require('./is-observable')
|
4 |
|
5 | module.exports = Proxy
|
6 |
|
7 | function Proxy (source, opts) {
|
8 | var releases = []
|
9 |
|
10 | var binder = LazyWatcher(update, listen, unlisten)
|
11 | binder.value = resolve(source)
|
12 |
|
13 | if (opts && opts.nextTick) binder.nextTick = true
|
14 | if (opts && opts.idle) binder.idle = true
|
15 |
|
16 | var observable = function MutantProxy (listener) {
|
17 | if (!listener) {
|
18 | return binder.getValue()
|
19 | }
|
20 | return binder.addListener(listener)
|
21 | }
|
22 |
|
23 | observable.get = function () {
|
24 | return source
|
25 | }
|
26 |
|
27 | observable.set = function (newSource) {
|
28 | unlisten()
|
29 | source = newSource
|
30 | if (binder.live) {
|
31 | listen()
|
32 | }
|
33 | binder.onUpdate()
|
34 | }
|
35 |
|
36 | return observable
|
37 |
|
38 |
|
39 |
|
40 | function listen () {
|
41 | if (isObservable(source)) {
|
42 | releases.push(
|
43 | source(binder.onUpdate)
|
44 | )
|
45 | }
|
46 | }
|
47 |
|
48 | function unlisten () {
|
49 | while (releases.length) {
|
50 | releases.pop()()
|
51 | }
|
52 | }
|
53 |
|
54 | function update () {
|
55 | binder.value = resolve(source)
|
56 | return true
|
57 | }
|
58 | }
|