adam@15: con t a = {Source : source a, adam@15: OnSet : source (a -> transaction {})} kkallio@14: adam@15: fun create [a] (i : a) = adam@15: s <- source i; adam@15: f <- source (fn _ => return ()); kkallio@14: adam@15: return {Source = s, adam@15: OnSet = f} kkallio@14: adam@15: fun onChange [a] (t : t a) f = adam@15: old <- get t.OnSet; adam@15: set t.OnSet (fn x => (old x; f x)) kkallio@14: adam@15: fun set [a] (t : t a) (v : a) = adam@15: Basis.set t.Source v; adam@15: f <- get t.OnSet; adam@15: f v kkallio@14: adam@15: fun get [a] (t : t a) = Basis.get t.Source kkallio@14: adam@15: fun value [a] (t : t a) = signal t.Source