packages feed

mysnapsession-example-0.3: clientcount/src/Application.hs

{-# 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 ClientSessionValue 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 0 (Just 10)
    return $ AppState heist sessions