packages feed

mysnapsession-0.3: src/Snap/Extension/Session.hs

{-# LANGUAGE TypeFamilies #-}

{-|
    'Snap.Extension.Session.Memory' exports the 'MonadSessionMemory' interface
    which allows you to keep an in-memory session object for each client session
    of a web application.
-}

module Snap.Extension.Session (
    MonadSession(..),
    inSession,
    withSession,
    getFromSession,
    deleteFromSession,
    setInSession
    ) where

import Snap.Types

import Data.Map (Map)
import qualified Data.Map as M

class MonadSnap m => MonadSession m where
    type SessionValue m
    getSession   :: m (SessionValue m)
    setSession   :: SessionValue m -> m ()
    clearSession :: m ()
    touchSession :: m ()

{-|
    Insert this into your routes to renew sessions on each request.
-}
inSession :: MonadSession m => m a -> m a
inSession handler = touchSession >> handler

withSession :: MonadSession m => (SessionValue m -> m a) -> m a
withSession handler = touchSession >> getSession >>= handler

getFromSession :: (Ord k, MonadSession m, SessionValue m ~ Map k a)
               => k -> m (Maybe a)
getFromSession key = fmap (M.lookup key) getSession

deleteFromSession :: (Ord k, MonadSession m, SessionValue m ~ Map k a)
                  => k -> m ()
deleteFromSession key = withSession $ setSession . M.delete key

setInSession :: (Ord k, MonadSession m, SessionValue m ~ Map k a)
             => k -> a -> m ()
setInSession k v = withSession $ setSession . M.insert k v