This example shows a reverse counter
To avoid unnecessary load, the push process will be killed when reaching 0
The last push message will be an script that will redirect to the menu"
{-# OPTIONS -XQuasiQuotes -XCPP #-} module PushDecrease ( pushDecrease) where import Control.Concurrent.STM import Text.Hamlet import Control.Concurrent -- #define ALONE -- to execute it alone, uncomment this #ifdef ALONE import MFlow.Wai.Blaze.Html.All main= runNavigation "" $ transientNav pushDecrease #else import MFlow.Wai.Blaze.Html.All hiding(page) import Menu #endif atomic= liftIO . atomically pushDecrease= do tv <- liftIO $ newTVarIO 10 page $ [shamlet| <div> <h2> Maxwell Smart push counter <p> This example shows a reverse counter <p> To avoid unnecessary load, the push process will be killed when reaching 0 <p> The last push message will be an script that will redirect to the menu" <h3> This message will be autodestroyed within ... |] ++> counter tv <++ b << "seconds" where counter tv = pageFlow "push" . push Html 0 $ do setTimeouts 2 0 -- kill the thread after 2 s of incactivity, when count finish n <- atomic $ readTVar tv if (n== -1) then do script << "window.location='/'" ++> noWidget else do atomic $ writeTVar tv $ n - 1 liftIO $ threadDelay 1000000 h1 << (show n) ++> noWidget