hxweb-0.1: src/Network/HxWeb/Monad.hs
-----------------------------------------------------------------------------
-- |
-- Module : Network.HxWeb.Monad
-- Copyright : (c) David Himmelstrup 2006
-- License : BSD-like
--
-- Maintainer : lemmih@gmail.com
-- Stability : provisional
-- Portability : portable
--
-----------------------------------------------------------------------------
module Network.HxWeb.Monad where
import Control.Monad.State
import Network.CGI
import Network.CGI.Monad
newtype WebPage st a
= WebPage { unWebPage :: StateT st (CGIT IO) (WebResult a) }
data WebResult ret
= WebResult ret
| Redirect String
| Fail String
deriving Show
instance Monad (WebPage st) where
WebPage g >>= f
= WebPage $
do g' <- g
case g' of
Redirect url -> return (Redirect url)
Fail msg -> return (Fail msg)
WebResult ret -> unWebPage (f ret)
fail = WebPage . return . Fail
return = WebPage . return . WebResult
instance MonadPlus (WebPage st) where
mzero = WebPage $ return (Fail "mzero")
mplus a b = WebPage $
do a' <- unWebPage a
case a' of
Fail _ -> unWebPage b
_ -> return a'
instance MonadIO (WebPage st) where
liftIO io = WebPage (do a <- liftIO io
return (WebResult a))
instance MonadState st (WebPage st) where
get = WebPage (liftM WebResult get)
put s = WebPage (liftM WebResult $ put s)
instance Functor (WebPage st) where
fmap fn a = do a' <- a
return (fn a')
instance MonadCGI (WebPage st) where
cgiAddHeader h v = WebPage (liftM WebResult $ lift (cgiAddHeader h v))
cgiGet fn = WebPage (liftM WebResult $ lift (cgiGet fn))