{-# 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 Paths_mysnapsession_example import Control.Monad.Trans 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 ClientSession AppState = Int clientSessionMgr = sessionMgr sessionKey :: ByteString sessionKey = $(embedDefaultKey) appInitializer :: Initializer AppState appInitializer = do hPath <- liftIO $ getDataFileName "clientcount/resources/templates" heist <- heistInitializer hPath sessions <- clientSessionInitializer sessionKey (Just 10) (return 0) return $ AppState heist sessions