{-# LANGUAGE DoRec #-} -- | Make sure this program runs without leaking memory import FRP.Sodium import Control.Applicative import Control.Exception import System.Timeout data Source = Source { unSource :: Reactive (Behaviour (Int, Int), Event Source) } verbose = False main = do (et, pushT) <- sync $ newEvent t <- sync $ hold 0 et let etens = (`div` 10) <$> et tens <- sync $ hold 0 etens let changeTens = filterJust $ snapshot (\new old -> if new /= old then Just new else Nothing) etens tens oout <- sync $ do let newSource = (\tens -> Source $ do let out = ((,) tens) <$> t return (out, newSource) ) <$> changeTens initPair = (((,) 0) <$> t, newSource) rec bPair <- hold initPair eSwitch let eSwitch = execute $ unSource <$> switchE (snd <$> bPair) return (fst <$> bPair) out <- sync $ switch oout kill <- sync $ listen (value out) $ \x -> if verbose then print x else (evaluate x >> return ()) timeout 4000000 $ mapM_ (sync . pushT) [0..] kill