UrlDisp 0.1.3 → 0.1.7
raw patch · 3 files changed
+26/−32 lines, 3 filesdep ~MaybeTdep ~basedep ~cgiPVP: major bump suggested
API removals or changes: PVP suggests a major version bump
Dependency ranges changed: MaybeT, base, cgi, mtl
API changes (from Hackage documentation)
- Network.UrlDisp: type UrlDisp m a = StateT UrlS (MaybeT m) a
+ Network.UrlDisp: data UrlDisp m a
- Network.UrlDisp: h :: (MonadCGI m) => m ()
+ Network.UrlDisp: h :: MonadCGI m => m ()
- Network.UrlDisp: runUrlDisp :: (MonadCGI m) => String -> UrlDisp m a -> m (Maybe a)
+ Network.UrlDisp: runUrlDisp :: MonadCGI m => String -> UrlDisp m a -> m (Maybe a)
Files
- Network/UrlDisp.hs +1/−16
- Network/UrlDisp/Types.hs +20/−13
- UrlDisp.cabal +5/−3
Network/UrlDisp.hs view
@@ -35,7 +35,7 @@ => String -- ^ path (hierarchical part of the URL) -> UrlDisp m a -> m (Maybe a)-runUrlDisp p hndl = runMaybeT (evalStateT hndl (UrlS {pPath = pinfo}))+runUrlDisp p (UrlDisp hn) = runMaybeT $ evalStateT hn (UrlS {pPath = pinfo}) where pinfo = (filter (not . null) . splitPath) p splitPath :: String -> [String] splitPath xs = let (zs, ys) = break (=='/') xs@@ -48,19 +48,4 @@ evalUrlDisp :: (MonadCGI m, MonadIO m) => UrlDisp m CGIResult -> m CGIResult evalUrlDisp handler = pathInfo >>= \s -> runUrlDisp s handler >>= maybe (outputNotFound s) return--{---- 1) we can't rely on existance of MaybeT MPlus instance--- in the Control.Monad.Maybe--- 2) uncommenting this gives compilation failure (duplicate instance decls)--- because Control.Monad.Maybe in fact does have the instance declared,--- contrary to the docs-instance Monad m => MonadPlus (MaybeT m) where- mzero = MaybeT $ return Nothing- mplus x y = MaybeT $ do- x' <- runMaybeT x- case x' of- Just _ -> return x'- Nothing -> runMaybeT y--}
Network/UrlDisp/Types.hs view
@@ -1,8 +1,7 @@ {-# LANGUAGE FlexibleInstances, GeneralizedNewtypeDeriving #-}-module Network.UrlDisp.Types (UrlS(..), UrlDisp) where+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 @@ -10,10 +9,26 @@ data UrlS = UrlS { pPath :: [String] } --- just a shorthand-type UrlDisp m a = StateT UrlS (MaybeT m) a+newtype UrlDisp m a = UrlDisp (StateT UrlS (MaybeT m) a)+ deriving (Functor, Monad, MonadState UrlS, MonadCGI, MonadIO,+ Applicative, Alternative) --- boilerplate, lots of it+instance MonadTrans UrlDisp where+ lift m = UrlDisp $ (lift . lift) m++instance MonadCGI m => Applicative (StateT UrlS (MaybeT m)) where+ pure = return+ (<*>) = ap++instance (MonadCGI m) => Alternative (StateT UrlS (MaybeT m)) where+ empty = lift . MaybeT $ return Nothing+ a <|> b = StateT $ \s -> MaybeT (runMaybeT (runStateT a s) >>=+ \v -> case v of+ Nothing -> runMaybeT (runStateT b s)+ Just _ -> return v)++-- FIXME: orphan instances, but apparently+-- there's no other way... instance (MonadCGI m) => MonadCGI (StateT s m) where cgiAddHeader n v = lift $ cgiAddHeader n v cgiGet = lift . cgiGet@@ -21,12 +36,4 @@ 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)
UrlDisp.cabal view
@@ -1,8 +1,9 @@ name: UrlDisp-version: 0.1.3+version: 0.1.7 author: Artyom Shalkhakov, Sterling Clover copyright: Artyom Shalkhakov, Sterling Clover maintainer: Artyom Shalkhakov <artyom.shalkhakov@gmail.com>+homepage: http://www.haskell.org/haskellwiki/UrlDisp license: BSD3 license-File: LICENSE@@ -12,11 +13,12 @@ category: Network, Web build-type: Simple-cabal-version: >= 1.2+cabal-version: >= 1.6 tested-with: GHC == 6.10.1 library- build-depends: base >= 4, cgi >= 3001.1.0, mtl, MaybeT+ build-depends: base ==4.*, cgi ==3001.1.*, mtl ==1.*, MaybeT ==0.1.* exposed-modules: Network.UrlDisp other-modules: Network.UrlDisp.Types, Network.UrlDisp.Controller ghc-options: -Wall+