happstack-server 7.3.5 → 7.3.6
raw patch · 4 files changed
+113/−47 lines, 4 filesdep ~mtldep ~transformersPVP ok
version bump matches the API change (PVP)
Dependency ranges changed: mtl, transformers
API changes (from Hackage documentation)
Files
- happstack-server.cabal +3/−3
- src/Happstack/Server/Internal/Monads.hs +69/−27
- src/Happstack/Server/Monads.hs +14/−8
- src/Happstack/Server/RqData.hs +27/−9
happstack-server.cabal view
@@ -1,5 +1,5 @@ Name: happstack-server-Version: 7.3.5+Version: 7.3.6 Synopsis: Web related tools and services. Description: Happstack Server provides an HTTP server and a rich set of functions for routing requests, handling query parameters, generating responses, working with cookies, serving files, and more. For in-depth documentation see the Happstack Crash Course <http://happstack.com/docs/crashcourse/index.html> License: BSD3@@ -79,7 +79,7 @@ hslogger >= 1.0.2, html, monad-control >= 0.3 && < 0.4,- mtl >= 2 && < 2.2,+ mtl >= 2 && < 2.3, old-locale, parsec < 4, process,@@ -90,7 +90,7 @@ time, time-compat, threads >= 0.5,- transformers >= 0.1.3 && < 0.4,+ transformers >= 0.1.3 && < 0.5, transformers-base >= 0.4 && < 0.5, utf8-string >= 0.3.4 && < 0.4, xhtml,
src/Happstack/Server/Internal/Monads.hs view
@@ -15,10 +15,12 @@ import Control.Monad.Reader ( ReaderT(ReaderT), runReaderT , MonadReader, ask, local, mapReaderT )-import Control.Monad.RWS ( RWST, mapRWST- )+import qualified Control.Monad.RWS.Lazy as Lazy ( RWST, mapRWST )+import qualified Control.Monad.RWS.Strict as Strict ( RWST, mapRWST ) -import Control.Monad.State (MonadState, StateT, get, put, mapStateT)+import Control.Monad.State.Class ( MonadState, get, put )+import qualified Control.Monad.State.Lazy as Lazy ( StateT, mapStateT )+import qualified Control.Monad.State.Strict as Strict ( StateT, mapStateT ) import Control.Monad.Trans ( MonadTrans, lift , MonadIO, liftIO )@@ -26,11 +28,10 @@ , MonadBaseControl(..) , ComposeSt, defaultLiftBaseWith, defaultRestoreM )-import Control.Monad.Writer ( WriterT(WriterT), runWriterT- , MonadWriter, tell, pass- , listens, mapWriterT- )-import qualified Control.Monad.Writer as Writer (listen) -- So that we can disambiguate 'Listen.listen'+import Control.Monad.Writer.Class ( MonadWriter, tell, pass, listens )+import qualified Control.Monad.Writer.Lazy as Lazy ( WriterT(WriterT), runWriterT, mapWriterT )+import qualified Control.Monad.Writer.Strict as Strict ( WriterT, mapWriterT )+import qualified Control.Monad.Writer.Class as Writer ( listen ) import Control.Monad.Trans.Maybe (MaybeT(MaybeT), runMaybeT) import qualified Data.ByteString.Lazy.UTF8 as LU (fromString)@@ -247,7 +248,7 @@ filterFun :: (a -> a) -> FilterFun a filterFun = Set . Dual . Endo -newtype FilterT a m b = FilterT { unFilterT :: WriterT (FilterFun a) m b }+newtype FilterT a m b = FilterT { unFilterT :: Lazy.WriterT (FilterFun a) m b } deriving (Functor, Applicative, Monad, MonadTrans) instance MonadBase b m => MonadBase b (FilterT a m) where@@ -258,7 +259,7 @@ {-# INLINE liftIO #-} instance MonadTransControl (FilterT a) where- newtype StT (FilterT a) b = StFilter {unStFilter :: StT (WriterT (FilterFun a)) b}+ newtype StT (FilterT a) b = StFilter {unStFilter :: StT (Lazy.WriterT (FilterFun a)) b} liftWith f = FilterT $ liftWith $ \run -> f $ liftM StFilter . run . unFilterT restoreT = FilterT . restoreT . liftM unStFilter @@ -447,11 +448,11 @@ -- | For when you really need to unpack a 'WebT' entirely (and not -- just unwrap the first layer with 'unWebT'). ununWebT :: WebT m a -> UnWebT m a-ununWebT = runMaybeT . runWriterT . unFilterT . runErrorT . unWebT+ununWebT = runMaybeT . Lazy.runWriterT . unFilterT . runErrorT . unWebT -- | For wrapping a 'WebT' back up. @'mkWebT' . 'ununWebT' = 'id'@ mkWebT :: UnWebT m a -> WebT m a-mkWebT = WebT . ErrorT . FilterT . WriterT . MaybeT+mkWebT = WebT . ErrorT . FilterT . Lazy.WriterT . MaybeT -- | See 'mapServerPartT' for a discussion of this function. mapWebT :: (UnWebT m a -> UnWebT n b)@@ -579,51 +580,92 @@ -- StateT -instance (ServerMonad m) => ServerMonad (StateT s m) where+instance (ServerMonad m) => ServerMonad (Lazy.StateT s m) where askRq = lift askRq- localRq f = mapStateT (localRq f)+ localRq f = Lazy.mapStateT (localRq f) -instance (FilterMonad res m) => FilterMonad res (StateT s m) where+instance (ServerMonad m) => ServerMonad (Strict.StateT s m) where+ askRq = lift askRq+ localRq f = Strict.mapStateT (localRq f)++instance (FilterMonad res m) => FilterMonad res (Lazy.StateT s m) where setFilter f = lift $ setFilter f composeFilter = lift . composeFilter- getFilter m = mapStateT (\m' ->+ getFilter m = Lazy.mapStateT (\m' -> do ((b,s), f) <- getFilter m' return ((b, f), s)) m -instance (WebMonad a m) => WebMonad a (StateT s m) where+instance (FilterMonad res m) => FilterMonad res (Strict.StateT s m) where+ setFilter f = lift $ setFilter f+ composeFilter = lift . composeFilter+ getFilter m = Strict.mapStateT (\m' ->+ do ((b,s), f) <- getFilter m'+ return ((b, f), s)) m++instance (WebMonad a m) => WebMonad a (Lazy.StateT s m) where finishWith = lift . finishWith +instance (WebMonad a m) => WebMonad a (Strict.StateT s m) where+ finishWith = lift . finishWith -- WriterT -instance (ServerMonad m, Monoid w) => ServerMonad (WriterT w m) where+instance (ServerMonad m, Monoid w) => ServerMonad (Lazy.WriterT w m) where askRq = lift askRq- localRq f = mapWriterT (localRq f)+ localRq f = Lazy.mapWriterT (localRq f) -instance (FilterMonad res m, Monoid w) => FilterMonad res (WriterT w m) where+instance (ServerMonad m, Monoid w) => ServerMonad (Strict.WriterT w m) where+ askRq = lift askRq+ localRq f = Strict.mapWriterT (localRq f)++instance (FilterMonad res m, Monoid w) => FilterMonad res (Lazy.WriterT w m) where setFilter f = lift $ setFilter f composeFilter = lift . composeFilter- getFilter m = mapWriterT (\m' ->+ getFilter m = Lazy.mapWriterT (\m' -> do ((b,w), f) <- getFilter m' return ((b, f), w)) m -instance (WebMonad a m, Monoid w) => WebMonad a (WriterT w m) where+instance (FilterMonad res m, Monoid w) => FilterMonad res (Strict.WriterT w m) where+ setFilter f = lift $ setFilter f+ composeFilter = lift . composeFilter+ getFilter m = Strict.mapWriterT (\m' ->+ do ((b,w), f) <- getFilter m'+ return ((b, f), w)) m++instance (WebMonad a m, Monoid w) => WebMonad a (Lazy.WriterT w m) where finishWith = lift . finishWith +instance (WebMonad a m, Monoid w) => WebMonad a (Strict.WriterT w m) where+ finishWith = lift . finishWith+ -- RWST -instance (ServerMonad m, Monoid w) => ServerMonad (RWST r w s m) where+instance (ServerMonad m, Monoid w) => ServerMonad (Lazy.RWST r w s m) where askRq = lift askRq- localRq f = mapRWST (localRq f)+ localRq f = Lazy.mapRWST (localRq f) -instance (FilterMonad res m, Monoid w) => FilterMonad res (RWST r w s m) where+instance (ServerMonad m, Monoid w) => ServerMonad (Strict.RWST r w s m) where+ askRq = lift askRq+ localRq f = Strict.mapRWST (localRq f)++instance (FilterMonad res m, Monoid w) => FilterMonad res (Lazy.RWST r w s m) where setFilter f = lift $ setFilter f composeFilter = lift . composeFilter- getFilter m = mapRWST (\m' ->+ getFilter m = Lazy.mapRWST (\m' -> do ((b,s,w), f) <- getFilter m' return ((b, f), s, w)) m -instance (WebMonad a m, Monoid w) => WebMonad a (RWST r w s m) where+instance (FilterMonad res m, Monoid w) => FilterMonad res (Strict.RWST r w s m) where+ setFilter f = lift $ setFilter f+ composeFilter = lift . composeFilter+ getFilter m = Strict.mapRWST (\m' ->+ do ((b,s,w), f) <- getFilter m'+ return ((b, f), s, w)) m++instance (WebMonad a m, Monoid w) => WebMonad a (Lazy.RWST r w s m) where+ finishWith = lift . finishWith++instance (WebMonad a m, Monoid w) => WebMonad a (Strict.RWST r w s m) where finishWith = lift . finishWith -- ErrorT
src/Happstack/Server/Monads.hs view
@@ -42,10 +42,13 @@ import Control.Monad.Error (Error, ErrorT) import Control.Monad.Trans (MonadIO(..),MonadTrans(lift)) import Control.Monad.Reader (ReaderT)-import Control.Monad.Writer (WriterT)-import Control.Monad.State (StateT)-import Control.Monad.RWS (RWST)-import qualified Data.ByteString.Char8 as B+import qualified Control.Monad.Writer.Lazy as Lazy (WriterT)+import qualified Control.Monad.Writer.Strict as Strict (WriterT)+import qualified Control.Monad.State.Lazy as Lazy (StateT)+import qualified Control.Monad.State.Strict as Strict (StateT)+import qualified Control.Monad.RWS.Lazy as Lazy (RWST)+import qualified Control.Monad.RWS.Strict as Strict (RWST)+import qualified Data.ByteString.Char8 as B import Data.Monoid (Monoid) import Happstack.Server.Internal.Monads import Happstack.Server.Types (Response, addHeader, getHeader, setHeader)@@ -58,10 +61,13 @@ instance (Functor m, Monad m, MonadPlus m , MonadIO m) => Happstack (ServerPartT m)-instance (Happstack m) => Happstack (StateT s m)-instance (Happstack m) => Happstack (ReaderT r m)-instance (Happstack m, Monoid w) => Happstack (WriterT w m)-instance (Happstack m, Monoid w) => Happstack (RWST r w s m)+instance (Happstack m) => Happstack (Lazy.StateT s m)+instance (Happstack m) => Happstack (Strict.StateT s m)+instance (Happstack m) => Happstack (ReaderT r m)+instance (Happstack m, Monoid w) => Happstack (Lazy.WriterT w m)+instance (Happstack m, Monoid w) => Happstack (Strict.WriterT w m)+instance (Happstack m, Monoid w) => Happstack (Lazy.RWST r w s m)+instance (Happstack m, Monoid w) => Happstack (Strict.RWST r w s m) instance (Happstack m, Error e) => Happstack (ErrorT e m) -- | Get a header out of the request.
src/Happstack/Server/RqData.hs view
@@ -62,9 +62,12 @@ import Control.Concurrent.MVar (newMVar) import Control.Monad (MonadPlus(mzero)) import Control.Monad.Reader (ReaderT(ReaderT, runReaderT), MonadReader(ask, local), mapReaderT)-import Control.Monad.State (StateT, mapStateT)-import Control.Monad.Writer (WriterT, mapWriterT)-import Control.Monad.RWS (RWST, mapRWST)+import qualified Control.Monad.State.Lazy as Lazy (StateT, mapStateT)+import qualified Control.Monad.State.Strict as Strict (StateT, mapStateT)+import qualified Control.Monad.Writer.Lazy as Lazy (WriterT, mapWriterT)+import qualified Control.Monad.Writer.Strict as Strict (WriterT, mapWriterT)+import qualified Control.Monad.RWS.Lazy as Lazy (RWST, mapRWST)+import qualified Control.Monad.RWS.Strict as Strict (RWST, mapRWST) import Control.Monad.Error (Error(noMsg, strMsg), ErrorT, mapErrorT) import Control.Monad.Trans (MonadIO(..), lift) import qualified Data.ByteString.Char8 as P@@ -190,19 +193,34 @@ localRqEnv f = mapReaderT (localRqEnv f) rqDataError e = lift (rqDataError e) -instance (Monad m, HasRqData m) => HasRqData (StateT s m) where+instance (Monad m, HasRqData m) => HasRqData (Lazy.StateT s m) where askRqEnv = lift askRqEnv- localRqEnv f = mapStateT (localRqEnv f)+ localRqEnv f = Lazy.mapStateT (localRqEnv f) rqDataError e = lift (rqDataError e) -instance (Monad m, HasRqData m, Monoid w) => HasRqData (WriterT w m) where+instance (Monad m, HasRqData m) => HasRqData (Strict.StateT s m) where askRqEnv = lift askRqEnv- localRqEnv f = mapWriterT (localRqEnv f)+ localRqEnv f = Strict.mapStateT (localRqEnv f) rqDataError e = lift (rqDataError e) -instance (Monad m, HasRqData m, Monoid w) => HasRqData (RWST r w s m) where+instance (Monad m, HasRqData m, Monoid w) => HasRqData (Lazy.WriterT w m) where askRqEnv = lift askRqEnv- localRqEnv f = mapRWST (localRqEnv f)+ localRqEnv f = Lazy.mapWriterT (localRqEnv f)+ rqDataError e = lift (rqDataError e)++instance (Monad m, HasRqData m, Monoid w) => HasRqData (Strict.WriterT w m) where+ askRqEnv = lift askRqEnv+ localRqEnv f = Strict.mapWriterT (localRqEnv f)+ rqDataError e = lift (rqDataError e)++instance (Monad m, HasRqData m, Monoid w) => HasRqData (Lazy.RWST r w s m) where+ askRqEnv = lift askRqEnv+ localRqEnv f = Lazy.mapRWST (localRqEnv f)+ rqDataError e = lift (rqDataError e)++instance (Monad m, HasRqData m, Monoid w) => HasRqData (Strict.RWST r w s m) where+ askRqEnv = lift askRqEnv+ localRqEnv f = Strict.mapRWST (localRqEnv f) rqDataError e = lift (rqDataError e) instance (Monad m, Error e, HasRqData m) => HasRqData (ErrorT e m) where