packages feed

mysnapsession-example-0.1: src/Application.hs

{-# LANGUAGE TypeFamilies #-}

{-

This module defines our application's monad and any application-specific
information it requires.

-}

module Application (
    App,
    appInitializer,
    AppSession(..)
    ) where

import Snap.Extension
import Snap.Extension.Heist.Impl
import Snap.Extension.Session.Memory
import Snap.Extension.Dialogues

type App = SnapExtend AppState

data AppState = AppState {
    templateState :: HeistState App,
    sessionMgr    :: MemorySessionManager AppSession
    }

instance HasHeistState App AppState where
    getHeistState     = templateState
    setHeistState s a = a { templateState = s }

instance HasMemorySessionManager AppState where
    type MemorySessionValue AppState = AppSession
    memorySessionMgr = sessionMgr

data AppSession = AppSession {
    dlgManager :: DlgManager App
    }

instance HasDlgManager App AppSession where
    getDlgManager = dlgManager

appInitializer :: Initializer AppState
appInitializer = do
    heist    <- heistInitializer "resources/templates"
    sessions <- memorySessionInitializer 1800 newSession
    return $ AppState heist sessions
  where
    newSession = fmap AppSession makeDlgManager