kkallio@14: con changePoller t = {Val : source t, kkallio@14: Last : source t} kkallio@14: kkallio@14: fun create [t ::: Type] (_ : eq t) (i : t) = kkallio@14: v <- source i; kkallio@14: l <- source i; kkallio@14: kkallio@14: return {Val = v, kkallio@14: Last = l} kkallio@14: kkallio@14: fun addChangeListener [t ::: Type] (_ : eq t) f pollInterval cp = kkallio@14: let kkallio@14: fun go () = kkallio@14: sleep pollInterval; kkallio@14: sample <- get cp.Val; kkallio@14: lst <- get cp.Last; kkallio@14: if sample = lst then kkallio@14: go () kkallio@14: else kkallio@14: f sample; kkallio@14: set cp.Last sample; kkallio@14: go () kkallio@14: in kkallio@14: go () kkallio@14: end kkallio@14: kkallio@14: fun ctl [t ::: Type] cp = cp.Val kkallio@14: kkallio@14: fun value [t ::: Type] cp = signal (cp.Val) kkallio@14: