packages feed

happstack-0.2.1: templates/project/src/AppState.hs

{-# LANGUAGE TemplateHaskell, TypeFamilies, DeriveDataTypeable,
    FlexibleInstances, MultiParamTypeClasses, FlexibleContexts,
    UndecidableInstances
    #-}
module AppState where
import Happstack.Data
import Happstack.State
import Control.Monad.Reader (ask)
import Control.Monad.State (get, put)
import Happstack.State.ClockTime

-- GuestBookEntry: simple guest book entry
$(deriveAll [''Show, ''Eq, ''Ord]
  [d|
      data GuestBookEntry = GuestBookEntry
          { author  :: String
          , message :: String
          , date    :: ClockTime
          }
      
      newtype GuestBook = GuestBook { guestBookEntries :: [GuestBookEntry] }
   |]
 )

$(deriveSerialize ''GuestBookEntry)
instance Version GuestBookEntry

$(deriveSerialize ''GuestBook)
instance Version GuestBook

-- AppState: define our own component, 'AppState' for data persistence
$(deriveAll [''Show, ''Eq, ''Ord]
  [d|
      data AppState = AppState
          { guestBook :: GuestBook
          }
   |])
$(deriveSerialize ''AppState)
instance Version AppState

instance Component AppState where
  type Dependencies AppState = End
  initialValue = AppState (GuestBook []) -- empty list of GuestBookEntry's

-- readGuestBook: get the guestBook from AppState
readGuestBook :: Query AppState GuestBook
readGuestBook = do
  state <- ask
  return $ guestBook state
  
addGuestBookEntry :: GuestBookEntry -> Update AppState  ()
addGuestBookEntry e = do
  st <- get
  let (GuestBook gb) = guestBook st
  put st{guestBook=GuestBook (e:gb)}
  
-- create types for event serialization
$(mkMethods ''AppState ['readGuestBook, 'addGuestBookEntry])