-- This leaks with GHC 7.8.3 -O2, strict field notwithstanding. {- OPTIONS_GHC -O2 #-} {-# OPTIONS_GHC -O0 #-} module Main ( main ) where import Types_min toggle (St b) = St (not b) {-# ANN module (SeqaidAnnExclude "toggle") #-} {-# ANN module (SeqaidAnnExclude "duration") #-} {-# ANN module (SeqaidAnnExclude "period") #-} {-# ANN module (SeqaidAnnExclude "main") #-} duration = 5000000 -- XXX tune for your hardware period = duration `div` 10 main = do putStrLn "Leaky started." rslt <- duty (St False) 0 (return $! rslt) >>= return putStrLn "Finished." duty :: State -> Int -> IO State duty state i = do let state' = toggle state if 0 == i `mod` period then return () else return () if i < duration then duty state' (1+i) else return state' {-# NOINLINE duty #-}