{-# LANGUAGE TemplateHaskell, DeriveDataTypeable,
TypeSynonymInstances, MultiParamTypeClasses, TypeFamilies, FlexibleContexts #-}
-- | BoardState.hs
-- A module which contain happstack state instances.
module BoardState where
import Board
import Happstack.State
import Data.Typeable
import Control.Monad.State
import Control.Monad.Reader
import qualified Data.Foldable as F
import qualified Data.Sequence as Seq
---
data BoardWrap = BoardWrap Board
deriving (Show, Typeable)
instance Version Post
$(deriveSerialize ''Post)
instance Version Thread
$(deriveSerialize ''Thread)
instance Version (Seq.Seq a) where mode = Primitive
instance Serialize a => Serialize (Seq.Seq a) where
getCopy = contain $ fmap Seq.fromList safeGet
putCopy = contain . safePut . F.toList
instance Version BoardWrap
$(deriveSerialize ''BoardWrap)
---
type Result = Either String Int
newPost' :: Bool -> Post -> Update BoardWrap Result
newPost' sage post = do
BoardWrap board <- get
putAndRet (newPost sage post board)
newThread' :: String -> Post -> Update BoardWrap Result
newThread' tag post = do
BoardWrap board <- get
putAndRet (newThread tag post board)
delPost' :: Int -> String -> Update BoardWrap Result
delPost' number password = do
BoardWrap board <- get
putAndRet (delPost number password board)
putAndRet :: BoardResult -> Update BoardWrap Result
putAndRet result =
case result of
Left err -> return $ Left err
Right (n, board') -> do
put (BoardWrap board')
return $ Right n
getBoard' :: Query BoardWrap Board
getBoard' = do
BoardWrap board <- ask
return board
---
$(mkMethods ''BoardWrap ['newPost', 'newThread', 'delPost',
'putAndRet, 'getBoard'])
instance Component BoardWrap where
type Dependencies BoardWrap = End
initialValue = BoardWrap newBoard