packages feed

mahoro-0.1.1: DBState.hs

{-# LANGUAGE TemplateHaskell, DeriveDataTypeable,
  TypeSynonymInstances, MultiParamTypeClasses, TypeFamilies,
  FlexibleContexts #-}

-- | DBState.hs
-- A module which contain happstack state instances.

module DBState where

import DB

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 DBWrap = DBWrap DB
              deriving (Show, Typeable)

instance Version URL
$(deriveSerialize ''URL)

instance Version JID
$(deriveSerialize ''JID)

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 DBWrap
$(deriveSerialize ''DBWrap)

---

addThread' url jid  = processDB $ addThread url jid
delThread' url jid  = processDB $ delThread url jid
delThreadAll' url   = processDB $ delThreadAll url
bye' jid            = processDB $ bye jid
setDescription' d url jid
                    = processDB $ setDescription url jid d
updateThread' url l = processDB $ updateThread url l

processDB :: DBProcess -> Update DBWrap String
processDB f = do
    DBWrap db <- get
    let (msg, db') = f db
    put $ DBWrap db'
    return msg

getDB :: Query DBWrap DB
getDB = do
    DBWrap db <- ask
    return db

---

$(mkMethods ''DBWrap ['addThread', 'delThread',
                      'delThreadAll', 'bye',
                      'setDescription', 'updateThread',
                      'getDB])

instance Component DBWrap where
    type Dependencies DBWrap = End
    initialValue = DBWrap newDB