Project

General

Profile

Download (843 Bytes) Statistics
| Branch: | Tag: | Revision:

haketilo / common / observable.js @ 6247f163

1
/**
2
 * part of Hachette
3
 * Facilitate listening to events
4
 *
5
 * Copyright (C) 2021 Wojtek Kosior
6
 * Redistribution terms are gathered in the `copyright' file.
7
 */
8

    
9
const make = (value=undefined) => ({value, listeners: new Set()});
10
const subscribe = (observable, cb) => observable.listeners.add(cb);
11
const unsubscribe = (observable, cb) => observable.listeners.delete(cb);
12

    
13
const silent_set = (observable, value) => observable.value = value;
14
const broadcast = (observable, ...values) =>
15
      observable.listeners.forEach(cb => cb(...values));
16

    
17
function set(observable, value)
18
{
19
    const old_value = observable.value;
20
    silent_set(observable, value);
21
    broadcast(observable, value, old_value);
22
}
23

    
24
const observables = {make, subscribe, unsubscribe, broadcast, silent_set, set};
25

    
26
/*
27
 * EXPORTS_START
28
 * EXPORT observables
29
 * EXPORTS_END
30
 */
(6-6/16)