{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE TypeSynonymInstances #-}
{-
This module defines our application's monad and any application-specific
information it requires.
-}
module Application (
App,
appInitializer
) where
import Data.ByteString.Char8 (ByteString)
import Snap.Extension
import Snap.Extension.Heist.Impl
import Snap.Extension.Session.Client
import Web.ClientSession
type App = SnapExtend AppState
data AppState = AppState {
templateState :: HeistState App,
sessionMgr :: ClientSessionManager Int
}
instance HasHeistState App AppState where
getHeistState = templateState
setHeistState s a = a { templateState = s }
instance HasClientSessionManager AppState where
type ClientSessionValue AppState = Int
clientSessionMgr = sessionMgr
sessionKey :: ByteString
sessionKey = $(embedDefaultKey)
appInitializer :: Initializer AppState
appInitializer = do
heist <- heistInitializer "clientcount/resources/templates"
sessions <- clientSessionInitializer sessionKey 0 (Just 10)
return $ AppState heist sessions