content: {-# OPTIONS   -XCPP #-}
  module PushSample (pushSample) where
  
  import Control.Concurrent.STM
  import System.IO.Unsafe
  
  -- #define ALONE -- to execute it alone, uncomment this
  #ifdef ALONE
  import MFlow.Wai.Blaze.Html.All
  main= runNavigation "" $ transientNav pushSample
  #else
  import MFlow.Wai.Blaze.Html.All hiding(retry, page)
  import Menu
  #endif
  
  
  
  lastLine = unsafePerformIO $ newTVarIO $ "The content will be appended here"
    
  pushSample=  do
    last <- liftIO $ newTVarIO ""
    page  $ h2 << "Basic Chat as a push example"
         ++> hr
         ++> pageFlow "push" (push Append 1000 (disp last ) <** input )
         **> br
         ++> br
         ++> wlink () << b << "exit"
  
    where
    -- the widget being pushed:
    disp last = do
        setTimeouts 100 0  -- after 100 seconds of inactivity , kill itself, but restart if needed
        line <- tget last
        p <<  line ++> noWidget
  
    input = autoRefresh  $ do
        line <- getString Nothing <** submitButton "Enter"
        tput lastLine line
  
  
    tput tv x = atomic $ writeTVar  tv  x
  
    tget last = atomic $ do
        msg <- readTVar lastLine
        lastmsg <- readTVar last
        case lastmsg == msg of
           False ->  do
              writeTVar last msg
              return msg
           True -> retry
             
  
  atomic= liftIO . atomically
  
  