-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/


-- | Route Wai middlewares based on HTTP verbs
--   
--   Please see the README on Github at
--   <a>https://git.localcooking.com/tooling/wai-middleware-verbs#readme</a>
@package wai-middleware-verbs
@version 0.3.2.1


-- | This module provides everything you need to respond depending on an
--   HTTP verbs. The <a>Combinators</a> section defines the <a>get</a>,
--   <a>post</a> and other functions you would expect in a toolset like
--   this. The <a>VerbListenerT</a> object is constructed from the
--   combinators, and turning it directly into a WAI <a>MiddlewareT</a> is
--   easy with <tt>verbsToMiddleware</tt>.
--   
--   <pre>
--   myApp :: MonadIO =&gt; MiddlewareT m
--   myApp = verbsToMiddleware $ do
--     get myMiddleware1
--     put uploader myMiddleware2
--     post uploader myMiddleware3
--     delete myMiddleware4
--     where
--       uploader :: MonadIO m =&gt; Request -&gt; m ()
--       uploader req = liftIO $ print =&lt;&lt; getStrictRequestBody req
--   </pre>
module Network.Wai.Middleware.Verbs

-- | For simple <tt>GET</tt> responses
get :: (Monad m, Monoid r) => r -> VerbListenerT r m ()

-- | For simple <tt>POST</tt> responses
post :: (Monad m, Monoid r) => r -> VerbListenerT r m ()

-- | For simple <tt>PUT</tt> responses
put :: (Monad m, Monoid r) => r -> VerbListenerT r m ()

-- | For simple <tt>DELETE</tt> responses
delete :: (Monad m, Monoid r) => r -> VerbListenerT r m ()

-- | A map from an HTTP verb, to a result and uploading method.
type VerbMap r = HashMap Verb r
type Verb = StdMethod

-- | This is the monad for our DSL - where <tt>r</tt> is the result type.
--   We leave this polymorphic for <a>ActionT</a> for <a>nested-routes</a>.
--   
--   <pre>
--   myListener :: MonadIO m =&gt; VerbListenerT (MiddlewareT m) m ()
--   myListener = do
--     get myMiddleware1
--     post uploader myMiddleware2
--     where
--       uploader :: MonadIO Request -&gt; m ()
--       uploader req =
--         liftIO $ print =&lt;&lt; strictRequestBody req
--   </pre>
newtype VerbListenerT r m a
VerbListenerT :: StateT (VerbMap r) m a -> VerbListenerT r m a
[runVerbListenerT] :: VerbListenerT r m a -> StateT (VerbMap r) m a
execVerbListenerT :: (Monad m) => VerbListenerT r m a -> m (VerbMap r)

-- | Take the monadic partial result of <tt>lookupVerb</tt>, and actually h
--   the upload.
lookupVerb :: Verb -> VerbMap r -> Maybe r

-- | Fetches the HTTP verb from the WAI <tt>Request</tt> - defaults to GET.
getVerb :: Request -> Verb
instance Control.Monad.Logger.MonadLogger m => Control.Monad.Logger.MonadLogger (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Catch.MonadMask m => Control.Monad.Catch.MonadMask (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Catch.MonadCatch m => Control.Monad.Catch.MonadCatch (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Catch.MonadThrow m => Control.Monad.Catch.MonadThrow (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Base.MonadBase b m => Control.Monad.Base.MonadBase b (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Cont.Class.MonadCont m => Control.Monad.Cont.Class.MonadCont (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Error.Class.MonadError e' m => Control.Monad.Error.Class.MonadError e' (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.IO.Class.MonadIO m => Control.Monad.IO.Class.MonadIO (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Reader.Class.MonadReader r m => Control.Monad.Reader.Class.MonadReader r (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Writer.Class.MonadWriter w m => Control.Monad.Writer.Class.MonadWriter w (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.Monad m => Control.Monad.State.Class.MonadState (Network.Wai.Middleware.Verbs.VerbMap r) (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.MonadPlus m => GHC.Base.MonadPlus (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Fix.MonadFix m => Control.Monad.Fix.MonadFix (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.Monad m => GHC.Base.Monad (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.MonadPlus m => GHC.Base.Alternative (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.Monad m => GHC.Base.Applicative (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Base.Functor m => GHC.Base.Functor (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance GHC.Generics.Generic Network.HTTP.Types.Method.StdMethod
instance (Control.Monad.Trans.Resource.Internal.MonadResource m, Control.Monad.Base.MonadBase GHC.Types.IO m) => Control.Monad.Trans.Resource.Internal.MonadResource (Network.Wai.Middleware.Verbs.VerbListenerT r m)
instance Control.Monad.Trans.Class.MonadTrans (Network.Wai.Middleware.Verbs.VerbListenerT r)
instance Data.Hashable.Class.Hashable Network.Wai.Middleware.Verbs.Verb
