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