1    type Atom<T> @abstract =
2        var value : T
3        var version : u32 = 0
4        let mut maybe_token = Option<Token>/None
5        let mut is_invoking_callbacks = false
6        let callbacks = StdList.new
7    
8        def subscribe (f : T * T -> Unit) =
9            callbacks.add f
10           Token { callbacks.remove f }
11   
12   type MutAtom<T> @[mut_of Atom] =
13       inherit Atom<T>
14   
15       def set (x : T) =
16           if x == value then return
17   
18           assert not is_invoking_callbacks
19           let prev_x = value
20           value = x
21           version += 1
22   
23           is_invoking_callbacks = true
24           for f in callbacks do
25               f prev_x x
26   
27           is_invoking_callbacks = false
28   
29       def push_token (token : Token) =
30           assert maybe_token.is_none
31           maybe_token = Some token
32   
33       def as_readonly = self as Atom<T>
34