{-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving #-} module Network.UrlDisp.Types (UrlS(..), UrlDisp) where import Control.Applicative (Alternative(..), Applicative(..)) -- import Control.Monad.Reader import Control.Monad.Maybe import Control.Monad.State.Strict import Network.CGI.Monad data UrlS = UrlS { pPath :: [String] } -- just a shorthand type UrlDisp m a = StateT UrlS (MaybeT m) a -- boilerplate, lots of it 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)