{-# 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)