module Happstack.Server.Monads
(
ServerPartT
, ServerPart
, Happstack
, ServerMonad(..)
, mapServerPartT
, mapServerPartT'
, UnWebT
, filterFun
, FilterMonad(..)
, ignoreFilters
, addHeaderM
, getHeaderM
, setHeaderM
, neverExpires
, WebMonad(..)
, escape
, escape'
, require
, requireM
) where
import Control.Applicative (Alternative, Applicative)
import Control.Monad (MonadPlus(mzero))
import Control.Monad.Trans (MonadIO(..),MonadTrans(lift))
import Control.Monad.Reader (ReaderT)
import Control.Monad.Writer (WriterT)
import Control.Monad.State (StateT)
import Control.Monad.RWS (RWST)
import qualified Data.ByteString.Char8 as B
import Data.Monoid (Monoid)
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)
instance (Happstack m) => Happstack (StateT s m)
instance (Happstack m) => Happstack (ReaderT r m)
instance (Happstack m, Monoid w) => Happstack (WriterT w m)
instance (Happstack m, Monoid w) => Happstack (RWST r w s 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
neverExpires :: (FilterMonad Response m) => m ()
neverExpires = setHeaderM "Expires" "Mon, 31 Dec 2035 12:00:00 GMT"
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