16 |
16 |
* IMPORT make_once
|
17 |
17 |
* IMPORT browser
|
18 |
18 |
* IMPORT is_chrome
|
|
19 |
* IMPORT observables
|
19 |
20 |
* IMPORTS_END
|
20 |
21 |
*/
|
21 |
22 |
|
... | ... | |
98 |
99 |
for (let item of await get_list_var(name))
|
99 |
100 |
map.set(item, await get(prefix + item));
|
100 |
101 |
|
101 |
|
return {map, prefix, name, listeners : new Set(), lock : make_lock()};
|
|
102 |
return {map, prefix, name, observable: observables.make(),
|
|
103 |
lock: make_lock()};
|
102 |
104 |
}
|
103 |
105 |
|
104 |
106 |
var list_by_prefix = {};
|
... | ... | |
121 |
123 |
prefixes = [prefixes];
|
122 |
124 |
|
123 |
125 |
for (let prefix of prefixes)
|
124 |
|
list_by_prefix[prefix].listeners.add(cb);
|
|
126 |
observables.subscribe(list_by_prefix[prefix].observable, cb);
|
125 |
127 |
}
|
126 |
128 |
|
127 |
129 |
exports.remove_change_listener = function (cb, prefixes=list_prefixes)
|
... | ... | |
130 |
132 |
prefixes = [prefixes];
|
131 |
133 |
|
132 |
134 |
for (let prefix of prefixes)
|
133 |
|
list_by_prefix[prefix].listeners.delete(cb);
|
134 |
|
}
|
135 |
|
|
136 |
|
function broadcast_change(change, list)
|
137 |
|
{
|
138 |
|
for (let listener_callback of list.listeners)
|
139 |
|
listener_callback(change);
|
|
135 |
observables.unsubscribe(list_by_prefix[prefix].observable, cb);
|
140 |
136 |
}
|
141 |
137 |
|
142 |
138 |
/* Prepare some hepler functions to get elements of a list */
|
... | ... | |
198 |
194 |
new_val : value
|
199 |
195 |
};
|
200 |
196 |
|
201 |
|
broadcast_change(change, list);
|
|
197 |
observables.broadcast(list.observable, change);
|
202 |
198 |
|
203 |
199 |
return old_val;
|
204 |
200 |
}
|
... | ... | |
236 |
232 |
new_val : undefined
|
237 |
233 |
};
|
238 |
234 |
|
239 |
|
broadcast_change(change, list);
|
|
235 |
observables.broadcast(list.observable, change);
|
240 |
236 |
|
241 |
237 |
return old_val;
|
242 |
238 |
}
|
... | ... | |
282 |
278 |
new_val : undefined
|
283 |
279 |
};
|
284 |
280 |
|
285 |
|
broadcast_change(change, list);
|
|
281 |
observables.broadcast(list.observable, change);
|
286 |
282 |
|
287 |
283 |
list.map.set(new_item, new_val);
|
288 |
284 |
|
... | ... | |
290 |
286 |
change.old_val = undefined;
|
291 |
287 |
change.new_val = new_val;
|
292 |
288 |
|
293 |
|
broadcast_change(change, list);
|
|
289 |
observables.broadcast(list.observable, change);
|
294 |
290 |
|
295 |
291 |
return old_val;
|
296 |
292 |
}
|
... | ... | |
375 |
371 |
for (let [item, val] of list_entries_it(list)) {
|
376 |
372 |
change.item = item;
|
377 |
373 |
change.old_val = val;
|
378 |
|
broadcast_change(change, list);
|
|
374 |
observables.broadcast(list.observable, change);
|
379 |
375 |
}
|
380 |
376 |
|
381 |
377 |
list.map = new Map();
|
extract observables implementation from storage.js