packages feed

MFlow-0.3.2.0: Demos/ShopCart.hs

{-# OPTIONS  -XDeriveDataTypeable #-}
module ShopCart ( shopCart) where

import MFlow.Wai.Blaze.Html.All

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

import Menu

-- to run it alone, comment import Menu and uncomment the code below
--main= runNavigation ""   shopCart

--askm= ask

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 . askm $ 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\n\n \
         \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.\n\n\
         \.Defines a table with links that return ints and a link to the menu, that abandon this flow.\n\
         \.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"