OL*      !"#$%&'()None35An uploaded file.%A class that is used for parsing for ,  ,  and . 6The parts of the path, when split on /, and the query. $Specify the way that Fn can get the  out of your context.eThe easiest way to instantiate this is to use the lens, but if you don't want to use lenses, define  and . Note that   is defined in terms of  and 6 and vice-versa, so you need to define _one_ of these. A normal WAI * and the parsed post body (if present). We can only parse the body once, so we need to have our request (which we pass around) to be able to have the parsed body.AA default request, which is a WAI defaultRequest and no post infoConvert an Fn application (provide a context, a context to response function and we'll create a WAI application by updating the  value for each call).The main construct for Fn,  takes a context (which it will pass to all handlers) and a list of potential matches (which, once they match, may still end up deciding not to handle the request - hence the double +). It can be nested. J app c = route c [ end ==> index , path "foo" // path "bar" // segment /? param "id ==> h] where index :: Ctxt -> IO (Maybe Response) index _ = okText "This is the index." h :: Ctxt -> Text -> Text -> IO (Maybe Response) h _ s i = okText ("got path /foo/" <> s <> ", with id=" <> i) The  function (and all your handlers) return 'IO (Maybe Response)', because each can elect to not respond (in which case we will continue to match on routes). But to construct an application, we need a response in the case that nothing matched - this is what ( allows you to specify. In particular, ' and ( may be useful.Serves static files out of the specified path according to the request path. Note that if you have matched parts of the path, those will not be included in the path used to find the static file. For example, if you have a file static/img/a.png , and do: #path "img" ==> staticServe "static"It will match  img/img/a.png, not  img/a.png!. If you wanted that, you could: !anything ==> staticServe "static"0If no file is found, this will continue routing.8The connective between route patterns and the handler that will be called if the pattern matches. The type is not particularly illuminating, as it uses polymorphism to be able to match route patterns with varying numbers (and types) of parts with functions of the corresponding number of arguments and types.SConnects two path segments. Note that when normally used, the type parameter r is  1. It is more general here to facilitate testing. Identical to U, provided simply because it serves as a nice visual difference when switching from 'path'/'segment' to  and friends.{Matches a literal part of the path. If there is no path part left, or the next part does not match, the whole match fails.ZMatches there being no parts of the path left. This is useful when matching index routes.Matches anything.Captures a part of the path. It will parse the part into the type specified by the handler it is matched to. If there is no segment, or if the segment cannot be parsed as such, it won't match.$Matches on a particular HTTP method.Matches on a single query parameter of the given name. If there is no parameters, or it cannot be parsed into the type needed by the handler, it won't match.Matches on query parameters of the given name. If there are no parameters, or they cannot be parsed into the type needed by the handler, it won't match. If the specified parameters are present, they will be parsed into the type needed by the handler, but if they aren't present or cannot be parsed, the handler will still be called.!7Matches an uploaded file with the given parameter name."HMatches all uploaded files, passing their parameter names and contents.#Returns , as a response.$Returns Html (in ,) as a response.%Returns ,& as a response with a 500 status code.&Returns Html (in ,') as a response with a 500 status code.'Returns a 404 with the given , as a body. Note that this returns a 'IO Response' not an 'IO (Maybe Response)' because the expectaiton is that you are calling this with .(Returns a 404 with the given html as a body. Note that this returns a 'IO Response' not an 'IO (Maybe Response)' because the expectaiton is that you are calling this with .)iRedirects to the given url. Note that the target is not validated, so it should be an absolute path/url.6 -./0 !"123#$%&'()45678*  !"#$%&'()*    !"#$%&'()*  -./0 !"123#$%&'()456789      !"#$%&'()*+,-./01234456789:;<=>?fn_CTVgAyQNWXcKoFhw8KEH7jWeb.FnFilefileNamefileContentType fileContent FromParam fromParam ParamError ParamMissingParamUnparsableParamOtherErrorReqRequestContext requestLens getRequest setRequest FnRequestdefaultFnRequesttoWAIroute fallthrough staticServe==>///?pathendanythingsegmentmethodparam paramManyparamOptfilefilesokTextokHtmlerrTexterrHtml notFoundText notFoundHtmlredirectwai_IMYA1U3SnZGIWgxCNGPKnnNetwork.Wai.InternalRequestbaseGHC.BaseMaybetext_1l1AN4I48k37RaQ6fm6CEhData.Text.InternalTextStoremimeMapfindParamMatches returnText plainTexthtml$fFromParamDouble$fFromParamInt$fFromParamText$fRequestContext(,)$fFunctorStore