module Happstack.Server.Monads
(
ServerPartT
, ServerPart
, Happstack(..)
, ServerMonad(..)
, mapServerPartT
, mapServerPartT'
, UnWebT
, filterFun
, FilterMonad(..)
, ignoreFilters
, addHeaderM
, getHeaderM
, setHeaderM
, WebMonad(..)
, escape
, escape'
, require
, requireM
) where
import Control.Applicative (Alternative, Applicative)
import Control.Monad (MonadPlus(mzero))
import Control.Monad.Trans (MonadIO(..),MonadTrans(lift))
import qualified Data.ByteString.Char8 as B
import Happstack.Server.Internal.Monads
import Happstack.Server.Types (Response, addHeader, getHeader, setHeader)
import Happstack.Server.RqData (HasRqData)
class ( ServerMonad m, WebMonad Response m, FilterMonad Response m
, MonadIO m, MonadPlus m, HasRqData m, Monad m, Functor m
, Applicative m, Alternative m) => Happstack m
instance (Functor m, Monad m, MonadPlus m, MonadIO m) => Happstack (ServerPartT m)
getHeaderM :: (ServerMonad m) => String -> m (Maybe B.ByteString)
getHeaderM a = askRq >>= return . (getHeader a)
addHeaderM :: (FilterMonad Response m) => String -> String -> m ()
addHeaderM a v = composeFilter $ \res-> addHeader a v res
setHeaderM :: (FilterMonad Response m) => String -> String -> m ()
setHeaderM a v = composeFilter $ \res -> setHeader a v res
require :: (MonadIO m, MonadPlus m) => IO (Maybe a) -> (a -> m r) -> m r
require fn handle = do
mbVal <- liftIO fn
case mbVal of
Nothing -> mzero
Just a -> handle a
requireM :: (MonadTrans t, Monad m, MonadPlus (t m)) => m (Maybe a) -> (a -> t m r) -> t m r
requireM fn handle = do
mbVal <- lift fn
case mbVal of
Nothing -> mzero
Just a -> handle a