{-# 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