content: {-# OPTIONS  -XDeriveDataTypeable -XCPP #-}
  module ShopCart ( shopCart) where
  import Data.Typeable
  import qualified Data.Vector as V
  import Text.Blaze.Html5 as El
  import Text.Blaze.Html5.Attributes as At hiding (step)
  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 "" $ transientNav grid
  #else
  import MFlow.Wai.Blaze.Html.All hiding(retry, page)
  import Menu
  #endif
  
  data ShopOptions= IPhone | IPod | IPad deriving (Bounded, Enum, Show,Read , Typeable)
  
  newtype Cart= Cart (V.Vector Int) deriving Typeable
  
  emptyCart= Cart $ V.fromList [0,0,0]
  
  shopCart= shopCart1
  
  shopCart1  =  do
  --     setHeader  stdheader 
  --     setTimeouts 200 $ 60*60   
       prod <-
          step . page $ do
               Cart cart <- getSessionData `onNothing` return  emptyCart
  
               moreexplain
                ++> 
                (table ! At.style (attr "border:1;width:20%;margin-left:auto;margin-right:auto")
                <<< caption <<  "choose an item"
                ++> thead << tr << ( th << b <<   "item" <> th << b <<  "times chosen")
                ++> (tbody
                    <<< tr ! rowspan (attr "2") << td << linkHome
                    ++> (tr <<< td <<< wlink  IPhone (b <<  "iphone")
                            <++  tdc << ( b <<  show ( cart V.! 0))
                    <|>  tr <<< td <<< wlink  IPod   (b <<  "ipod")
                            <++  tdc << ( b <<  show ( cart V.! 1))
                    <|>  tr <<< td <<< wlink  IPad   (b <<  "ipad")
                            <++  tdc << ( b <<  show ( cart V.! 2)))
                    <++  tr << td <<  linkHome
                    ))
  
                    
       let i = fromEnum prod
       Cart cart <- getSessionData `onNothing` return  emptyCart
       setSessionData . Cart $ cart V.// [(i, cart V.!  i + 1 )]
       shopCart1
  
      where
      tdc= td ! At.style (attr "text-align:center")
      linkHome= a ! href  (attr $ "/" ++ noScript) << b <<  "home"
      attr= fromString
      moreexplain= do
       p $ El.span <<(
           "A persistent flow  (uses step). The process is killed after the timeout set by setTimeouts "++
           "but it is restarted automatically. Event If you restart the whole server, it remember the shopping cart "++
           " The shopping cart is not logged, just the products bought returned by step are logged. The shopping cart "++
           " is rebuild from the events (that is an example of event sourcing."++
           " .Defines a table with links that return ints and a link to the menu, that abandon this flow. "++
           " .The cart state is not stored, Only the history of events is saved. The cart is recreated by running the history of events.")
  
       p << "The second parameter of \"setTimeout\" is the time during which the cart is recorded"
  