module Network.UrlDisp.Types (UrlS(..), UrlDisp) where
import Control.Applicative (Alternative(..), Applicative(..))
import Control.Monad.Maybe
import Control.Monad.State.Strict
import Network.CGI.Monad
data UrlS = UrlS { pPath :: [String] }
type UrlDisp m a = StateT UrlS (MaybeT m) a
instance (MonadCGI m) => MonadCGI (StateT s m) where
cgiAddHeader n v = lift $ cgiAddHeader n v
cgiGet = lift . cgiGet
instance (MonadCGI m) => MonadCGI (MaybeT m) where
cgiAddHeader n v = lift $ cgiAddHeader n v
cgiGet = lift . cgiGet
instance (Monad m) => Applicative (StateT UrlS (MaybeT (CGIT m))) where
pure = return
(<*>) = ap
instance (Monad m) => Alternative (StateT UrlS (MaybeT (CGIT m))) where
empty = lift mzero
a <|> b = StateT $ \s -> mplus (runStateT a s) (runStateT b s)