nested-routes-10.0.0: Declarative, compositional Wai responses
Copyright(c) 2015 2016 2017 2018 Athan Clark
LicenseBSD-style
Maintainerathan.clark@gmail.com
Stabilityexperimental
PortabilityGHC
Safe HaskellSafe-Inferred
LanguageHaskell2010

Web.Routes.Nested

Description

This module exports most of what you'll need for sophisticated routing - all the tools from wai-middleware-verbs (routing for the incoming HTTP method) and wai-middleware-content-type (routing for the incoming Accept header, and implied file extension), WAI itself, and wai-transformers - some simple type aliases wrapped around WAI's Application and Middleware types, allowing us to embed monad transformer stacks for our applications.

To match a route, you have a few options - you can match against a string literal, a regular expression (via regex-compat), or an attoparsec parser. This list will most likely grow in the future, depending on demand.

There is also support for embedding security layers in your routes, in the same nested manner. By "tagging" a set of routes with an authorization role (with auth), you populate a list of roles breached during any request. The function argument to routeAuth guards a Request to pass or fail at the high level, while auth lets you create your authorization boundaries on a case-by-case basis. Both allow you to tap into the monad transformer stack for logging, STRefs, database queries, etc.

Synopsis

Router Construction

match Source #

Arguments

:: Monad m 
=> Match xs' xs childContent resultContent 
=> UrlChunks xs

Predicative path to match against

-> childContent

The response to send

-> RouterT resultContent sec m () 

Embed a MiddlewareT into a set of routes via a matching string. You should expect the match to create arity in your handler - the childContent variable. The arity of childContent may grow or shrink, depending on the heterogeneous list created from the list of parsers, regular expressions, or arbitrary predicates in the order written - so something like:

match (p_ "double-parser" double </> o_)
  handler

...then handler must have arity Double ->. If this route was at the top level, then the total arity must be Double -> MiddlewareT m.

Generally, if the routes you are building get grouped by a predicate with matchGroup, then we would need another level of arity before the Double.

matchHere Source #

Arguments

:: Monad m 
=> childContent

The response to send

-> RouterT childContent sec m () 

Create a handle for the current route - an alias for h -> match o_ h.

matchAny Source #

Arguments

:: Monad m 
=> childContent

The response to send

-> RouterT childContent sec m () 

Match against any route, as a last resort against all failing matches - use this for a catch-all at some level in their routes, something like a not-found 404 page is useful.

matchGroup Source #

Arguments

:: Monad m 
=> MatchGroup xs' xs childContent resultContent childSec resultSec 
=> UrlChunks xs

Predicative path to match against

-> RouterT childContent childSec m ()

Child routes to nest

-> RouterT resultContent resultSec m () 

Prepends a common route to an existing set of routes. You should note that doing this with a parser or regular expression will necessitate the existing arity in the handlers before the progam can compile.

auth Source #

Arguments

:: Monad m 
=> sec

Your security token

-> AuthScope 
-> RouterT content (SecurityToken sec) m () 

Sets the security role and error handler for a set of routes, optionally including its parent route.

Routing Middleware

route Source #

Arguments

:: MonadIO m 
=> RouterT (MiddlewareT m) sec m a

The Router

-> MiddlewareT m 

Use this function to run your RouterT into a MiddlewareT; making your router executable in WAI. Note that this only responds with content, and doesn't protect your routes with your calls to auth; to protect routes, postcompose this with routeAuth:

route routes . routeAuth routes

routeAuth Source #

Arguments

:: MonadIO m 
=> MonadThrow m 
=> (Request -> [sec] -> m ())

authorization method

-> RouterT (MiddlewareT m) (SecurityToken sec) m a

The Router

-> MiddlewareT m 

Supply a method to decide whether or not to throwM an exception based on the current Request and the layers of auth tokens passed in your router, turn your router into a guard for middlewares, basically.

Precise Route Extraction

extractMatch Source #

Arguments

:: MonadIO m 
=> [Text]

The path to match against

-> RouterT r sec m a

The Router

-> m (Maybe r) 

Extracts only the normal match, matchGroup and matchHere routes.

extractMatchAny Source #

Arguments

:: MonadIO m 
=> [Text]

The path to match against

-> RouterT r sec m a

The Router

-> m (Maybe r) 

Extracts only the matchAny responses; something like the greatest-lower-bound.

extractAuthSym Source #

Arguments

:: MonadIO m 
=> [Text]

The path to match against

-> RouterT x (SecurityToken sec) m a

The Router

-> m [sec] 

Find the security tokens / authorization roles affiliated with a request for a set of routes.

extractAuth Source #

Arguments

:: MonadIO m 
=> MonadThrow m 
=> (Request -> [sec] -> m ())

authorization method

-> Request 
-> RouterT x (SecurityToken sec) m a 
-> m () 

Extracts only the security handling logic, and turns it into a guard.

extractNearestVia Source #

Arguments

:: MonadIO m 
=> [Text]

The path to match against

-> (RouterT r sec m a -> m (RootedPredTrie Text r)) 
-> RouterT r sec m a 
-> m (Maybe r) 

Given a way to draw out a special-purpose trie from our route set, route to the responses based on a furthest-route-reached method, or like a greatest-lower-bound.

Metadata

data SecurityToken s Source #

Use a custom security token type and an AuthScope to define where and what kind of security should take place.

Constructors

SecurityToken 

Instances

Instances details
Show s => Show (SecurityToken s) Source # 
Instance details

Defined in Web.Routes.Nested

data AuthScope Source #

Designate the scope of security to the set of routes - either only the adjacent routes, or the adjacent and the parent container node (root node if not declared).

Instances

Instances details
Show AuthScope Source # 
Instance details

Defined in Web.Routes.Nested

Eq AuthScope Source # 
Instance details

Defined in Web.Routes.Nested

type Match xs' xs childContent resultContent = (xs' ~ CatMaybes xs, Singleton (UrlChunks xs) childContent (RootedPredTrie Text resultContent), ArityTypeListIso childContent xs' resultContent) Source #

The constraints necessary for match.

type MatchGroup xs' xs childContent resultContent childSec resultSec = (ExtrudeSoundly xs' xs childContent resultContent, ExtrudeSoundly xs' xs childSec resultSec) Source #

The constraints necessary for matchGroup.

Re-Exports

class ToUrlChunks a (xs :: [Maybe *]) | a -> xs where Source #

Methods

toUrlChunks :: a -> UrlChunks xs Source #

type UrlChunks = PathChunks Text Source #

Container when defining route paths

type EitherUrlChunk = PathChunk Text Source #

Constrained to AttoParsec, Regex-Compat and T.Text

origin_ :: UrlChunks '[] Source #

The Origin chunk - the equivalent to []

literal_ :: Text -> EitherUrlChunk 'Nothing Source #

Match against a Literal chunk

file_ :: Text -> EitherUrlChunk ('Just Text) Source #

Removes file extension from the matchedhttp:/hackage.haskell.orgpackage/nested-routes route

parse_ :: Text -> Parser r -> EitherUrlChunk ('Just r) Source #

Match against a Parsed chunk, with attoparsec.

regex_ :: Text -> Regex -> EitherUrlChunk ('Just [String]) Source #

Match against a Regular expression chunk, with regex-compat.

pred_ :: Text -> (Text -> Maybe r) -> EitherUrlChunk ('Just r) Source #

Match with a predicate against the url chunk directly.

(</>) :: EitherUrlChunk mx -> UrlChunks xs -> UrlChunks (mx ': xs) infixr 9 Source #

Prefix a routable path by more predicative lookup data.

type ActionT urlbase m a = VerbListenerT (FileExtListenerT urlbase m a) m a Source #

The type of "content" builders; using the wai-middleware-verbs and wai-middleware-content-type packages.

type ExtrudeSoundly xs' xs c r = (xs' ~ CatMaybes xs, ArityTypeListIso c xs' r, Extrude (UrlChunks xs) (RootedPredTrie Text c) (RootedPredTrie Text r)) Source #

Soundness constraint showing that a function's arity can be represented as a type-level list.

newtype RouterT x sec m a Source #

The (syntactic) monad for building a router with functions like "Web.Routes.Nested.match". it should have a shape of RouterT (MiddlewareT m) (SecurityToken s) m a when used with "Web.Routes.Nested.route".

Constructors

RouterT 

Fields

Instances

Instances details
MonadTrans (RouterT x sec) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

lift :: Monad m => m a -> RouterT x sec m a #

Monad m => MonadState (Tries x sec) (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

get :: RouterT x sec m (Tries x sec) #

put :: Tries x sec -> RouterT x sec m () #

state :: (Tries x sec -> (a, Tries x sec)) -> RouterT x sec m a #

MonadIO m => MonadIO (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

liftIO :: IO a -> RouterT x sec m a #

Monad m => Applicative (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

pure :: a -> RouterT x sec m a #

(<*>) :: RouterT x sec m (a -> b) -> RouterT x sec m a -> RouterT x sec m b #

liftA2 :: (a -> b -> c) -> RouterT x sec m a -> RouterT x sec m b -> RouterT x sec m c #

(*>) :: RouterT x sec m a -> RouterT x sec m b -> RouterT x sec m b #

(<*) :: RouterT x sec m a -> RouterT x sec m b -> RouterT x sec m a #

Functor m => Functor (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

fmap :: (a -> b) -> RouterT x sec m a -> RouterT x sec m b #

(<$) :: a -> RouterT x sec m b -> RouterT x sec m a #

Monad m => Monad (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

(>>=) :: RouterT x sec m a -> (a -> RouterT x sec m b) -> RouterT x sec m b #

(>>) :: RouterT x sec m a -> RouterT x sec m b -> RouterT x sec m b #

return :: a -> RouterT x sec m a #

data Tries x s Source #

The internal data structure built during route declaration.

Instances

Instances details
Monoid (Tries x s) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

mempty :: Tries x s #

mappend :: Tries x s -> Tries x s -> Tries x s #

mconcat :: [Tries x s] -> Tries x s #

Semigroup (Tries x s) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

(<>) :: Tries x s -> Tries x s -> Tries x s #

sconcat :: NonEmpty (Tries x s) -> Tries x s #

stimes :: Integral b => b -> Tries x s -> Tries x s #

Monad m => MonadState (Tries x sec) (RouterT x sec m) Source # 
Instance details

Defined in Web.Routes.Nested.Types

Methods

get :: RouterT x sec m (Tries x sec) #

put :: Tries x sec -> RouterT x sec m () #

state :: (Tries x sec -> (a, Tries x sec)) -> RouterT x sec m a #

execRouterT :: Monad m => RouterT x sec m a -> m (Tries x sec) Source #

Run the monad, only getting the built state and throwing away a.

action :: MonadBaseControl IO m stM => Extractable stM => ActionT urlbase m () -> MiddlewareT m Source #

Run the content builder into a middleware that responds when the content is satisfiable (i.e. Accept headers are O.K., etc.)

fileExtsToMiddleware :: forall m (stM :: Type -> Type) urlbase a. (MonadBaseControl IO m stM, Extractable stM) => FileExtListenerT urlbase m a -> MiddlewareT m #

lookupFileExt :: Maybe AcceptHeader -> Maybe FileExt -> FileExtMap -> Maybe Response #

Given an HTTP Accept header and a content type to base lookups off of, and a map of responses, find a response.

blaze :: forall (m :: Type -> Type) urlbase. Monad m => Html -> FileExtListenerT urlbase m () #

json :: forall j (m :: Type -> Type) urlbase. (ToJSON j, Monad m) => j -> FileExtListenerT urlbase m () #

bytestringOnly :: ByteString -> Status -> ResponseHeaders -> Response #

The exact same thing as Network.Wai.responseLBS.

bytestring :: forall (m :: Type -> Type) urlbase. Monad m => FileExt -> ByteString -> FileExtListenerT urlbase m () #

cassius :: forall (m :: Type -> Type) urlbase. Monad m => Css -> FileExtListenerT urlbase m () #

clay :: forall (m :: Type -> Type) urlbase. Monad m => Config -> [App] -> Css -> FileExtListenerT urlbase m () #

julius :: forall (m :: Type -> Type) urlbase. Monad m => Javascript -> FileExtListenerT urlbase m () #

lucid :: forall (m :: Type -> Type) urlbase. Monad m => HtmlT m () -> FileExtListenerT urlbase m () #

lucius :: forall (m :: Type -> Type) urlbase. Monad m => Css -> FileExtListenerT urlbase m () #

text :: forall (m :: Type -> Type) urlbase. Monad m => Text -> FileExtListenerT urlbase m () #

invalidEncoding :: forall (m :: Type -> Type) urlbase. Monad m => ResponseVia -> FileExtListenerT urlbase m () #

Use this combinator as the last one, as a "catch-all":

myApp = do
  text "foo"
  invalidEncoding myErrorHandler -- handles all except text/plain

possibleFileExts :: [FileExt] -> AcceptHeader -> [FileExt] #

Takes an Accept header and returns the other file types handleable, in order of prescedence.

mapFileExtMap :: forall (m :: Type -> Type) urlbase a. Monad m => (FileExtMap -> FileExtMap) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a #

getLogger :: forall (m :: Type -> Type) urlbase. Monad m => FileExtListenerT urlbase m (Status -> Maybe Integer -> IO ()) #

overFileExts :: forall (m :: Type -> Type) urlbase a. Monad m => [FileExt] -> (ResponseVia -> ResponseVia) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a #

toExt :: (Text, Text) -> Maybe FileExt #

matches a file extension (including it's prefix dot - .html for example) to a known one.

getFileExt :: [Text] -> Maybe FileExt #

Gets the known file extension from a Request's pathInfo.

data FileExt #

Supported file extensions

Constructors

Html 
Css 
JavaScript 
Json 
Text 
Markdown 
Other !Text

excluding prefix period, i.e. foo

Instances

Instances details
Generic FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Associated Types

type Rep FileExt :: Type -> Type #

Methods

from :: FileExt -> Rep FileExt x #

to :: Rep FileExt x -> FileExt #

Show FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Eq FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

(==) :: FileExt -> FileExt -> Bool #

(/=) :: FileExt -> FileExt -> Bool #

Ord FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Hashable FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

hashWithSalt :: Int -> FileExt -> Int #

hash :: FileExt -> Int #

Monad m => MonadState FileExtMap (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

get :: FileExtListenerT urlbase m FileExtMap #

put :: FileExtMap -> FileExtListenerT urlbase m () #

state :: (FileExtMap -> (a, FileExtMap)) -> FileExtListenerT urlbase m a #

MonadBaseControl b m stM => MonadBaseControl b (FileExtListenerT urlbase m) (Compose stM ((,) FileExtMap)) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftBaseWith :: (RunInBase (FileExtListenerT urlbase m) b (Compose stM ((,) FileExtMap)) -> b a) -> FileExtListenerT urlbase m a #

restoreM :: Compose stM ((,) FileExtMap) a -> FileExtListenerT urlbase m a #

MonadTransControl (FileExtListenerT urlbase) ((,) FileExtMap) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftWith :: Monad m => (Run (FileExtListenerT urlbase) ((,) FileExtMap) -> m a) -> FileExtListenerT urlbase m a #

restoreT :: Monad m => m (FileExtMap, a) -> FileExtListenerT urlbase m a #

type Rep FileExt 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

type Rep FileExt = D1 ('MetaData "FileExt" "Network.Wai.Middleware.ContentType.Types" "wai-middleware-content-type-0.7.0-DgIWu6zLZBN74bkqGTnl92" 'False) ((C1 ('MetaCons "Html" 'PrefixI 'False) (U1 :: Type -> Type) :+: (C1 ('MetaCons "Css" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "JavaScript" 'PrefixI 'False) (U1 :: Type -> Type))) :+: ((C1 ('MetaCons "Json" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Text" 'PrefixI 'False) (U1 :: Type -> Type)) :+: (C1 ('MetaCons "Markdown" 'PrefixI 'False) (U1 :: Type -> Type) :+: C1 ('MetaCons "Other" 'PrefixI 'False) (S1 ('MetaSel ('Nothing :: Maybe Symbol) 'SourceUnpack 'SourceStrict 'DecidedStrict) (Rec0 Text)))))

data ResponseVia #

Instances

Instances details
Monad m => MonadState FileExtMap (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

get :: FileExtListenerT urlbase m FileExtMap #

put :: FileExtMap -> FileExtListenerT urlbase m () #

state :: (FileExtMap -> (a, FileExtMap)) -> FileExtListenerT urlbase m a #

MonadBaseControl b m stM => MonadBaseControl b (FileExtListenerT urlbase m) (Compose stM ((,) FileExtMap)) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftBaseWith :: (RunInBase (FileExtListenerT urlbase m) b (Compose stM ((,) FileExtMap)) -> b a) -> FileExtListenerT urlbase m a #

restoreM :: Compose stM ((,) FileExtMap) a -> FileExtListenerT urlbase m a #

MonadTransControl (FileExtListenerT urlbase) ((,) FileExtMap) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftWith :: Monad m => (Run (FileExtListenerT urlbase) ((,) FileExtMap) -> m a) -> FileExtListenerT urlbase m a #

restoreT :: Monad m => m (FileExtMap, a) -> FileExtListenerT urlbase m a #

newtype FileExtListenerT urlbase (m :: Type -> Type) a #

The monad for our DSL - when using the combinators, our result will be this type:

myListener :: FileExtListenerT base (MiddlewareT m) m ()
myListener = do
  text "Text!"
  json ("Json!" :: T.Text)

Instances

Instances details
MonadBaseControl b m => MonadBaseControl b (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Associated Types

type StM (FileExtListenerT urlbase m) a #

Methods

liftBaseWith :: (RunInBase (FileExtListenerT urlbase m) b -> b a) -> FileExtListenerT urlbase m a #

restoreM :: StM (FileExtListenerT urlbase m) a -> FileExtListenerT urlbase m a #

MonadError e m => MonadError e (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

throwError :: e -> FileExtListenerT urlbase m a #

catchError :: FileExtListenerT urlbase m a -> (e -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m a #

MonadReader r m => MonadReader r (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

ask :: FileExtListenerT urlbase m r #

local :: (r -> r) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a #

reader :: (r -> a) -> FileExtListenerT urlbase m a #

Monad m => MonadState FileExtMap (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

get :: FileExtListenerT urlbase m FileExtMap #

put :: FileExtMap -> FileExtListenerT urlbase m () #

state :: (FileExtMap -> (a, FileExtMap)) -> FileExtListenerT urlbase m a #

MonadWriter w m => MonadWriter w (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

writer :: (a, w) -> FileExtListenerT urlbase m a #

tell :: w -> FileExtListenerT urlbase m () #

listen :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m (a, w) #

pass :: FileExtListenerT urlbase m (a, w -> w) -> FileExtListenerT urlbase m a #

MonadBase b m => MonadBase b (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftBase :: b α -> FileExtListenerT urlbase m α #

(MonadUrl urlbase m, Monad m) => MonadUrl urlbase (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

locToUrl :: Location urlbase -> FileExtListenerT urlbase m URL #

MonadBaseControl b m stM => MonadBaseControl b (FileExtListenerT urlbase m) (Compose stM ((,) FileExtMap)) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftBaseWith :: (RunInBase (FileExtListenerT urlbase m) b (Compose stM ((,) FileExtMap)) -> b a) -> FileExtListenerT urlbase m a #

restoreM :: Compose stM ((,) FileExtMap) a -> FileExtListenerT urlbase m a #

MonadTransControl (FileExtListenerT urlbase) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Associated Types

type StT (FileExtListenerT urlbase) a #

Methods

liftWith :: Monad m => (Run (FileExtListenerT urlbase) -> m a) -> FileExtListenerT urlbase m a #

restoreT :: Monad m => m (StT (FileExtListenerT urlbase) a) -> FileExtListenerT urlbase m a #

MonadTrans (FileExtListenerT urlbase) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

lift :: Monad m => m a -> FileExtListenerT urlbase m a #

MonadTransControl (FileExtListenerT urlbase) ((,) FileExtMap) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftWith :: Monad m => (Run (FileExtListenerT urlbase) ((,) FileExtMap) -> m a) -> FileExtListenerT urlbase m a #

restoreT :: Monad m => m (FileExtMap, a) -> FileExtListenerT urlbase m a #

MonadFix m => MonadFix (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

mfix :: (a -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m a #

MonadIO m => MonadIO (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftIO :: IO a -> FileExtListenerT urlbase m a #

MonadPlus m => Alternative (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

empty :: FileExtListenerT urlbase m a #

(<|>) :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a #

some :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m [a] #

many :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m [a] #

Monad m => Applicative (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

pure :: a -> FileExtListenerT urlbase m a #

(<*>) :: FileExtListenerT urlbase m (a -> b) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b #

liftA2 :: (a -> b -> c) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b -> FileExtListenerT urlbase m c #

(*>) :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b -> FileExtListenerT urlbase m b #

(<*) :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b -> FileExtListenerT urlbase m a #

Functor m => Functor (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

fmap :: (a -> b) -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b #

(<$) :: a -> FileExtListenerT urlbase m b -> FileExtListenerT urlbase m a #

Monad m => Monad (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

(>>=) :: FileExtListenerT urlbase m a -> (a -> FileExtListenerT urlbase m b) -> FileExtListenerT urlbase m b #

(>>) :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m b -> FileExtListenerT urlbase m b #

return :: a -> FileExtListenerT urlbase m a #

MonadPlus m => MonadPlus (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

mzero :: FileExtListenerT urlbase m a #

mplus :: FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a #

MonadCatch m => MonadCatch (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

catch :: Exception e => FileExtListenerT urlbase m a -> (e -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m a #

MonadMask m => MonadMask (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

mask :: ((forall a. FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m b) -> FileExtListenerT urlbase m b #

uninterruptibleMask :: ((forall a. FileExtListenerT urlbase m a -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m b) -> FileExtListenerT urlbase m b #

generalBracket :: FileExtListenerT urlbase m a -> (a -> ExitCase b -> FileExtListenerT urlbase m c) -> (a -> FileExtListenerT urlbase m b) -> FileExtListenerT urlbase m (b, c) #

MonadThrow m => MonadThrow (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

throwM :: Exception e => e -> FileExtListenerT urlbase m a #

MonadLogger m => MonadLogger (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

monadLoggerLog :: ToLogStr msg => Loc -> LogSource -> LogLevel -> msg -> FileExtListenerT urlbase m () #

MonadCont m => MonadCont (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

callCC :: ((a -> FileExtListenerT urlbase m b) -> FileExtListenerT urlbase m a) -> FileExtListenerT urlbase m a #

(MonadResource m, MonadBase IO m) => MonadResource (FileExtListenerT urlbase m) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

liftResourceT :: ResourceT IO a -> FileExtListenerT urlbase m a #

Monad m => Monoid (FileExtListenerT urlbase m ()) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

mempty :: FileExtListenerT urlbase m () #

mappend :: FileExtListenerT urlbase m () -> FileExtListenerT urlbase m () -> FileExtListenerT urlbase m () #

mconcat :: [FileExtListenerT urlbase m ()] -> FileExtListenerT urlbase m () #

Monad m => Semigroup (FileExtListenerT urlbase m ()) 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

Methods

(<>) :: FileExtListenerT urlbase m () -> FileExtListenerT urlbase m () -> FileExtListenerT urlbase m () #

sconcat :: NonEmpty (FileExtListenerT urlbase m ()) -> FileExtListenerT urlbase m () #

stimes :: Integral b => b -> FileExtListenerT urlbase m () -> FileExtListenerT urlbase m () #

type StT (FileExtListenerT urlbase) a 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

type StT (FileExtListenerT urlbase) a = StT (StateT FileExtMap) (StT (ReaderT (Status -> Maybe Integer -> IO ())) a)
type StM (FileExtListenerT urlbase m) a 
Instance details

Defined in Network.Wai.Middleware.ContentType.Types

type StM (FileExtListenerT urlbase m) a = ComposeSt (FileExtListenerT urlbase) m a