sodium-0.10.0.0: examples/tests/memory-test-7.hs
{-# LANGUAGE DoRec #-}
-- | Make sure this program runs without leaking memory
import FRP.Sodium
import Data.Maybe
import Control.Applicative
import Control.Exception
import Control.Monad
import Control.DeepSeq
import System.Timeout
verbose = False
flam :: Event () -> Behavior Int -> Reactive (Behavior Int)
flam e time = do
let eStart = snapshot (flip const) e time
-- Only allow eStart through when we're not already running
hold 0 eStart
main = do
(e, push) <- sync newEvent
(eFlip, pushFlip) <- sync newEvent
(time, pushTime) <- sync $ newBehavior 0
out <- sync $ do
eInit <- flam e time
eFlam <- hold eInit (execute ((const $ flam e time) <$> eFlip))
switch eFlam
kill <- sync $ listen (value out) $ \x ->
if verbose then print x else (evaluate (rnf x) >> return ())
let loop t = do
sync $ pushTime t
sync $ push ()
when (t `mod` 18 == 0) $ sync $ pushFlip ()
loop (t+1)
timeout 4000000 $ loop 0
kill