content: {-# OPTIONS -XCPP -XDeriveDataTypeable #-} 
  module Counter ( counter, counterWidget) where
  import Data.Monoid
  import Data.String
  import Data.Typeable
  
  -- #define ALONE -- to execute it alone, uncomment this
  
  #ifdef ALONE
  import MFlow.Wai.Blaze.Html.All
  main= runNavigation "" $ step counter
  #else
  import MFlow.Wai.Blaze.Html.All hiding(page)
  import Menu
  #endif
  
  attr= fromString 
  text= fromString
  
  counter= do
     page  $ explain
         ++> pageFlow "c" (counterWidget 0)
         <++ br
         <|> wlink () << p << "exit"
     where
     explain= do   -- using the blaze-html monad
          p << "This example emulates the"
          a ! href (attr "http://www.seaside.st/about/examples/counter") << "seaside counter example"
          p << "This widget uses a \"callback\" that permit an independent"
          text " execution flow for each widget. "
          a ! href (attr "/noscript/multicounter") << "Multicounter"
          text " instantiate various counter widgets"
          p << "But while the seaside case the callback update the widget object, in this case"
          p << "the callback recursively generates a new copy of the counter with the value modified."
  
  counterWidget n=
        (h2 << show n
         ++> wlink "i" << b << " ++ "
         <|> wlink "d" << b << " -- ")
        `wcallback`
          \op -> case op  of
            "i" -> counterWidget (n + 1)
            "d" -> counterWidget (n - 1)
  