git ssb

1+

Matt McKegg / mutant



Tree: 32bfa7adad1fe9cf5b68bf33d66a08c36fab8de1

Files: 32bfa7adad1fe9cf5b68bf33d66a08c36fab8de1 / proxy-collection.js

2326 bytesRaw
1var LazyWatcher = require('./lib/lazy-watcher')
2var resolve = require('./resolve')
3var isObservable = require('./is-observable')
4
5module.exports = ProxyCollection
6
7function ProxyCollection (source) {
8 var releases = []
9
10 var binder = LazyWatcher(update, listen, unlisten)
11 binder.value = resolve(source)
12
13 var observable = function MutantProxyCollection (listener) {
14 if (!listener) {
15 return binder.getValue()
16 }
17 return binder.addListener(listener)
18 }
19
20 observable.get = function (index) {
21 if (isObservable(source) && source.get) {
22 return source.get(index)
23 } else if (Array.isArray(resolve(source))) {
24 return resolve(source)[index]
25 }
26 }
27
28 observable.getLength = function () {
29 if (isObservable(source) && source.getLength) {
30 return source.getLength()
31 } else if (Array.isArray(resolve(source))) {
32 return resolve(source).length
33 }
34 }
35
36 observable.includes = function (value) {
37 if (isObservable(source) && source.includes) {
38 return source.includes(value)
39 } else if (Array.isArray(resolve(source))) {
40 return !!~resolve(source).indexOf(value)
41 }
42 }
43
44 observable.indexOf = function (value) {
45 if (isObservable(source) && source.indexOf) {
46 return source.indexOf(value)
47 } else if (Array.isArray(resolve(source))) {
48 return resolve(source).indexOf(value)
49 }
50 }
51
52 observable.forEach = function (fn, context) {
53 if (isObservable(source) && source.forEach) {
54 return source.forEach(fn, context)
55 } else if (Array.isArray(resolve(source))) {
56 return resolve(source).slice().forEach(fn, context)
57 }
58 }
59
60 observable.find = function (fn) {
61 if (isObservable(source) && source.find) {
62 return source.find(fn)
63 } else if (Array.isArray(resolve(source))) {
64 return resolve(source).find(fn)
65 }
66 }
67
68 observable.set = function (newSource) {
69 unlisten()
70 source = newSource
71 if (binder.live) {
72 listen()
73 }
74 binder.onUpdate()
75 }
76
77 return observable
78
79 // scoped
80
81 function listen () {
82 if (isObservable(source)) {
83 releases.push(
84 source(binder.onUpdate)
85 )
86 }
87 }
88
89 function unlisten () {
90 while (releases.length) {
91 releases.pop()()
92 }
93 }
94
95 function update () {
96 binder.value = resolve(source) || {}
97 return true
98 }
99}
100

Built with git-ssb-web