happstack-0.3.1: templates/project/src/GuestBook/State.hs
{-# LANGUAGE TemplateHaskell, TypeFamilies, DeriveDataTypeable,
FlexibleInstances, MultiParamTypeClasses, FlexibleContexts,
UndecidableInstances
#-}
module GuestBook.State where
import Happstack.Data
import Happstack.State
import Control.Monad.Reader (ask)
import Control.Monad.State (modify)
import Happstack.State.ClockTime
$(deriveAll [''Show, ''Eq, ''Ord, ''Default]
[d|
-- |GuestBookEntry: simple guest book entry
data GuestBookEntry = GuestBookEntry
{ author :: String
, message :: String
, date :: ClockTime
}
-- |GuestBook: a list of GuestBookEntry
newtype GuestBook = GuestBook { guestBookEntries :: [GuestBookEntry] }
|])
$(deriveSerialize ''GuestBookEntry)
instance Version GuestBookEntry
$(deriveSerialize ''GuestBook)
instance Version GuestBook
-- | get the 'GuestBook'
readGuestBook :: Query GuestBook GuestBook
readGuestBook = ask
-- | add a 'GuestBookEntry' to the 'GuestBook'
addGuestBookEntry :: GuestBookEntry -> Update GuestBook ()
addGuestBookEntry e = modify $ \(GuestBook gb) -> (GuestBook (e:gb))
-- |make Guestbook its own Component
instance Component GuestBook where
type Dependencies GuestBook = End
initialValue = defaultValue
-- create types for event serialization
$(mkMethods ''GuestBook ['readGuestBook, 'addGuestBookEntry])