h$sh      !"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~                                                                                                                                     None! !#$%-./0258<=>? webgear-coreModifier used to indicate whether a trait is parsed strictly or leniently. webgear-coreModifier used to indicate whether a trait is required or optional.None! !#$%-./0258<=>?  webgear-core A request processed by a handler webgear-coreunderlying WAI request  webgear-core!Get the value of a request header  webgear-coreSee   webgear-coreSee   webgear-coreSee   webgear-coreSee  webgear-coreSee  webgear-coreSee  webgear-coreSee  webgear-coreSee  webgear-coreSee        None! !#$%-./0258<=>? w webgear-core4An HTTP response sent from the server to the client.The response contains a status, optional headers and an optional body payload. webgear-coreResponse status code webgear-coreResponse headers webgear-coreOptional response body webgear-coreGenerate a WAI responseNone" !#$%-./0258<=>? webgear-core7Constraint that proves that all the traits in the list ts are also present in the list qs. webgear-core)Type error for nicer UX of missing traits webgear-core&Constraint that proves that the trait t# is present in the list of traits ts. webgear-core"Get the attribute associated with t from a linked value. See also: 0.  webgear-core0A value linked with a type-level list of traits.! webgear-core%Retrive the value from a linked value" webgear-core Sets h ts a is equivalent to *(Set h t1 a, Set h t2 a, ..., Set h tn a) where ts = [t1, t2, ..., tn].# webgear-core Gets h ts a is equivalent to *(Get h t1 a, Get h t2 a, ..., Get h tn a) where ts = [t1, t2, ..., tn].$ webgear-core Set a trait attribute on a value% webgear-coreSet a trait attribute t on the value a.& webgear-core&Extract trait attributes from a value.' webgear-core5Attempt to deduce the trait attribute from the value a.( webgear-coreA trait t that can be retrieved from a but could be absent.) webgear-coreType that indicates that the trait does not exist for a value. This could be an error message, exception etc.* webgear-coreA trait is an attribute t associated with a value a.+ webgear-coreType of the associated attribute when the trait holds for a value, webgear-core*Wrap a value with an empty list of traits.- webgear-coreForget the head trait. webgear-coreAttempt to link an additional trait with an already linked value. This can fail indicating an ) of the trait./ webgear-coreSet a trait attribute on linked value to produce another linked value0 webgear-coreRetrieve a trait.pick is used along with / to retrieve an attribute from a linked value: pick @t $ from val% webgear-coreThe trait to set webgear-coreA function to generate a linked value. This function must be called by the %, implementation to generate a linked value. webgear-coreAn arrow that attches a new trait attribute to a value linked with other traits' webgear-coreThe trait to extract webgear-core3Arrow that extracts the trait and can possibly fail !"#$%&'()*+,-./0*+()&'# $%",-!./0None! !#$%-./0258<=>? 4 webgear-core2Indicates that a handler cannot process this route6 webgear-core(A summary associated with part of an API9 webgear-core*Description associated with part of an API< webgear-coreA middleware enhances a = and produces another handler.= webgear-core2A handler arrow from a linked request to response.> webgear-core-A handler is an arrow with a monadic context.)Handlers have the following capabilities:+Lift a monadic action into a handler arrow. Implement : typeclass so that conditionals can be used in arrow code. Implement + for routing requests to specific handlers.Provide contextual documentation elements - description and summary? webgear-core*Lift a monadic function to a handler arrow@ webgear-core3Consume all remaining path components with an arrowA webgear-core%Set a description of a part of an APIB webgear-core!Set a summary of a part of an APIC webgear-core7Parts of the request path used by the routing machineryE webgear-core>Indicates that the request does not match the current handler.F webgear-coreLifts ! into a handler arrow.456789:;<=>?@ABCDEF>?@ABCD459:;678=?"6 Y webgear-coreA [% that is optional and parsed strictlyZ webgear-coreA [% that is required and parsed strictly[ webgear-coreA *+ for capturing an HTTP header of specified name! and converting it to some type val. The modifiers e and p determine how missing headers and parsing errors are handled. The header name is compared case-insensitively.] webgear-coreError in converting a header_ webgear-coreIndicates a missing headera webgear-core9Extract a header value and convert it to a value of type val.(The associated trait attribute has type val.Example usage: 8header @"Content-Length" @Integer errorHandler okHandlerb webgear-coreExtract an optional header value and convert it to a value of type val.(The associated trait attribute has type  Maybe val; a Nothing> value indicates that the header is missing from the request.Example usage: optionalHeader @"Content-Length" @Integer errorHandler okHandlerc webgear-core9Extract a header value and convert it to a value of type val.(The associated trait attribute has type Either Text val. The parsing is done leniently and any errors are reported in the trait attribute.Example usage: ?lenientHeader @"Content-Length" @Integer errorHandler okHandlerd webgear-core9Extract a header value and convert it to a value of type val.(The associated trait attribute has type Maybe (Either Text val). The parsing is done leniently. Any parsing errors and missing header are reported in the trait attribute.Example usage: 8optionalLenientHeader @"Content-Length" @Integer handlere webgear-core!Set a header value in a response.Example usage: :response' <- setHeader @"Content-Length" -< (response, 42)f webgear-core+Set an optional header value in a response.Setting the header to  will remove it from the response if it was previously set. The header will be considered as optional in all relevant places (such as documentation).Example usage: response' <- setOptionalHeader @"Content-Length" -< (response, Just 42)a webgear-core Error handlerb webgear-core Error handlerc webgear-core Error handlerYZ[\]^_`abcdef[\_`]^ZYabcdefNone! !#$%-./0258<=>?$w webgear-core1Failure to match method against an expected value{ webgear-coreA *+ for capturing the HTTP method of a request} webgear-core6Check whether the request has a specified HTTP method.Example usage: method @GET handlerIf the request does not have the specified method, another handler will be tried.>It is also idiomatic to use the template haskell quasiquoter  or  in cases where both an HTTP method and a path need to be matched.wxyz{|}{|wxyz}None! !#$%-./0258<=>?/(  webgear-coreTrait to indicate that no more path components are present in the request webgear-coreFailure to extract a  webgear-coreA path variable that is extracted and converted to a value of type val. The tag is usually a type-level symbol (string) to uniquely identify this variable. webgear-coreA path component which is literally matched against the request but discarded after that. webgear-core)A middleware that literally matches path s. The symbol s could contain one or more parts separated by a forward slash character. The route will be rejected if there is no match.For example, the following code could be used to match the URL path "a/b/c" and then invoke handler: path "a/b/c" handler webgear-coreA middleware that captures a path variable from a single path component.3The value captured is converted to a value of type val. The route will be rejected if the value is not found or cannot be converted.For example, the following code could be used to read a path component as 2 tagged with the symbol "objId", and then invoke handler: pathVar @"objId" @Int handler webgear-core7A middleware that verifies that end of path is reached. webgear-coreProduces middleware(s) to match an optional HTTP method and some path components.This middleware matches a prefix of path components, the remaining components can be matched by subsequent uses of .-This quasiquoter can be used in several ways: QuasiQuoterEquivalent Middleware[match| /a/b/c |] "/a/b/c"atch| /a/b/objId:Int/d |] "/a/b" .  @"objId" @Int .  "d"[match| GET /a/b/c |]} GET .  "/a/b/c"[match| GET /a/b/objId:Int/d |]} GET .  "/a/b" .  @"objId" @Int .  "d" webgear-coreProduces middleware(s) to match an optional HTTP method and the entire request path.This middleware is intended to be used in cases where the entire path needs to be matched. Use : middleware to match only an initial portion of the path.-This quasiquoter can be used in several ways: QuasiQuoterEquivalent Middleware[route| /a/b/c |] "/a/b/c" . oute| /a/b/objId:Int/d |] "/a/b" .  @"objId" @Int .  "d" . [route| GET /a/b/c |]} GET .  "/a/b/c" . [route| GET /a/b/objId:Int/d |]} GET .  "/a/b" .  @"objId" @Int .  "d" . ) None! !#$%-./0258<=>?6  webgear-core%Error in converting a query parameter webgear-core#Indicates a missing query parameter webgear-core% that is optional and parsed strictly webgear-core% that is required and parsed strictly webgear-core+Capture a query parameter with a specified name$ and convert it to a value of type val. The type parameter e denotes whether the query parameter is required to be present. The parse style parameter p determines whether the conversion is applied strictly or leniently. webgear-core=Extract a query parameter and convert it to a value of type val.(The associated trait attribute has type val.Example usage: 3queryParam @"limit" @Integer errorHandler okHandler webgear-coreExtract an optional query parameter and convert it to a value of type val.(The associated trait attribute has type  Maybe val; a Nothing value indicates that the parameter is missing from the request.Example usage: ;optionalQueryParam @"limit" @Integer errorHandler okHandler webgear-core?@T0 webgear-coreHTTP response status webgear-core-Generate a response with the specified status webgear-coreContinue 100 response webgear-core Switching Protocols 101 response webgear-coreOK 200 response webgear-coreCreated 201 response webgear-coreAccepted 202 response webgear-coreNon-Authoritative 203 response webgear-coreNo Content 204 response webgear-coreReset Content 205 response webgear-corePartial Content 206 response webgear-coreMultiple Choices 300 response webgear-coreMoved Permanently 301 response webgear-coreFound 302 response webgear-coreSee Other 303 response webgear-coreNot Modified 304 response webgear-coreTemporary Redirect 307 response webgear-corePermanent Redirect 308 response webgear-coreBad Request 400 response webgear-coreUnauthorized 401 response webgear-corePayment Required 402 response webgear-coreForbidden 403 response webgear-coreNot Found 404 response webgear-coreMethod Not Allowed 405 response webgear-coreNot Acceptable 406 response webgear-core*Proxy Authentication Required 407 response webgear-coreRequest Timeout 408 response webgear-coreConflict 409 response webgear-coreGone 410 response webgear-coreLength Required 411 response webgear-core Precondition Failed 412 response webgear-core%Request Entity Too Large 413 response webgear-core!Request URI Too Long 414 response webgear-core#Unsupported Media Type 415 response webgear-core,Requested Range Not Satisfiable 416 response webgear-coreExpectation Failed 417 response webgear-coreI'm A Teapot 418 response webgear-core!Unprocessable Entity 422 response webgear-core"Precondition Required 428 response webgear-coreToo Many Requests 429 response webgear-core,Request Header Fields Too Large 431 response webgear-core"Internal Server Error 500 response webgear-coreNot Implemented 501 response webgear-coreBad Gateway 502 response webgear-core Service Unavailable 503 response webgear-coreGateway Timeout 504 response webgear-core'HTTP Version Not Supported 505 response webgear-core,Network Authentication Required 511 response11 None! !#$%-./0258<=>?K8  webgear-coreA *3 for converting a JSON formatted body into a value. webgear-core%Request or response body with a type t. webgear-core%Middleware to extract a request body.The  nextHandler< is invoked after successfully extracting the body and the  errorHandler# is invoked when there is an error.Usage: ;requestBody @t (Just "text/plain") errorHandler nextHandler webgear-coreParse the request body as JSON and convert it to a value of type t.The  nextHandler: is invoked when the body is parsed successfully and the  errorHandler, is invoked when there is a parsing failure.Usage: +jsonRequestBody @t errorHandler nextHandler webgear-coreSame as  but with a media type application/json. webgear-core.Set the response body along with a media type.The media type value is used to set the "Content-Type" header in the response. webgear-core8Set the response body without specifying any media type. webgear-core>Set the response body to a JSON value along with a media type.The media type value is used to set the "Content-Type" header in the response. webgear-core&Set the response body to a JSON value.?Nf webgear-core.The components of Authorization request header webgear-coreAuthentication scheme webgear-coreAuthentication token webgear-core'The protection space for authentication webgear-core Trait for "Authorization" header webgear-coreExtract the "Authorization" header from a request by specifying an authentication scheme.The header is split into the scheme and token parts and returned. webgear-core%Create a "401 Unauthorized" response.The response will have a plain text body and an appropriate "WWW-Authenticate" header. webgear-coreThe authentication scheme webgear-coreThe authentication realm   None" !#$%-./0258<=>?X  webgear-core%Error extracting a JWT from a request webgear-core5Trait for JWT authentication with the "Bearer" scheme webgear-core3Trait for JWT authentication with a bearer token: #https://tools.ietf.org/html/rfc6750This trait supports a custom scheme instead of the standard "Bearer" scheme. webgear-coreSettings to validate the JWT webgear-coreJWK to validate the JWT webgear-core9Convert the claims set to the trait attribute or an error webgear-coreMiddleware to add JWT authentication protection for a handler. Expects the JWT to be available via a standard bearer authorization header in the format: Authorization: Bearer Example usage: $jwtAuth cfg errorHandler nextHandlerThe  errorHandler< is invoked if the credentials are invalid or missing. The  nextHandler< is invoked if the credentials were retrieved successfully. webgear-coreMiddleware to add optional JWT authentication protection for a handler. Expects the JWT to be available via a standard bearer authorization header in the format: Authorization: Bearer Example usage: optionalJWTAuth cfg handlerThis middleware will not fail if authorization credentials are invalid or missing. Instead the trait attribute is of type  ( e) t so that the handler can process the authentication error appropriately. webgear-coreMiddleware to add JWT authentication protection for a handler. Expects the JWT to be available via an authorization header in the format: Authorization: Example usage: 1jwtAuth' @"" cfg errorHandler nextHandlerThe  errorHandler< is invoked if the credentials are invalid or missing. The  nextHandler< is invoked if the credentials were retrieved successfully. webgear-coreMiddleware to add JWT authentication protection for a handler. Expects the JWT to be available via an authorization header in the format: Authorization: Example usage: ,optionalJWTAuth' @"" cfg nextHandlerThis middleware will not fail if authorization credentials are invalid or missing. Instead the trait attribute is of type  ( e) t so that the handler can process the authentication error appropriately. webgear-coreAuthentication configuration webgear-core Error handler webgear-coreAuthentication configuration webgear-coreAuthentication configuration webgear-core Error handler webgear-coreAuthentication configurationNone" !#$%-./0258<=>?`  webgear-core1Error retrieving basic authentication credentials webgear-core?Basic authentication credentials retrieved from an HTTP request webgear-core"Password for basic authentication. webgear-coreUsername for basic authentication. Valid usernames cannot contain ':' characters. webgear-core-Trait for HTTP basic authentication with the Basic scheme. webgear-core%Trait for HTTP basic authentication: #https://tools.ietf.org/html/rfc7617 webgear-core:Convert the credentials to the trait attribute or an error webgear-coreMiddleware to add basic authentication protection for a handler.Example usage: &basicAuth cfg errorHandler nextHandlerThe  errorHandler< is invoked if the credentials are invalid or missing. The  nextHandler< is invoked if the credentials were retrieved successfully. webgear-core Similar to - but supports a custom authentication scheme.Example usage: 1basicAuth' @"scheme" cfg errorHandler nextHandler webgear-coreMiddleware to add optional basic authentication protection for a handler.Example usage: !optionalBasicAuth cfg nextHandlerThis middleware will not fail if credentials are invalid or missing. Instead the trait attribute is of type  ( e) t so that the handler can process the authentication error appropriately. webgear-core Similar to 0 but supports a custom authentication scheme.Example usage: ,optionalBasicAuth' @"scheme" cfg nextHandler webgear-coreAuthentication configuration webgear-core Error handler webgear-coreAuthentication configuration webgear-core Error handler webgear-coreAuthentication configuration webgear-coreAuthentication configurationNone! !#$%-./0258<=>?b webgear-core*Serve files under the specified directory. webgear-core-Serve a file specified by the input filepath. webgear-coreThe directory to serve webgear-coreOptional index filename for the root directory. A 404 Not Found response will be returned for requests to the root path if this is set to Nothing.None! !#$%-./0258<=>?d webgear-core+Constraints that include all common traits.The type variables are:h - The handler arrowm& - The underlying monad of the handlerreq - List of traits the handler # from the requestres - List of traits the handler " on the responseYZ[\]^_`abcdefwxyz{|}None! !#$%-./0258<=>?e  !"#$%&'())*++,-./0456789:;<=>BA?@CDEFYZ[\]^_`abcdefwxyz{|} !"#$%&&'()*+,-./0123456789:;<=>?@ABCDEFFGGHIIJKLMNOPQRRSTUVWXYZ[\]^_`abcdefghiijjkklmnopqrstuvwxyz{|}~                                                                                                                                      !"#$%)webgear-core-1.0.3-LQ081UTJrJCD5qQ0pZoh6iWebGear.Core.ModifiersWebGear.Core.RequestWebGear.Core.ResponseWebGear.Core.TraitWebGear.Core.HandlerWebGear.Core.Trait.HeaderWebGear.Core.Trait.MethodWebGear.Core.Trait.PathWebGear.Core.Trait.QueryParamWebGear.Core.Trait.StatusWebGear.Core.Trait.BodyWebGear.Core.Trait.Auth.CommonWebGear.Core.Trait.Auth.JWTWebGear.Core.Trait.Auth.BasicWebGear.Core.Handler.StaticWebGear.Core.Traitsmatchroute WebGear.Core ParseStyleStrictLenient ExistenceRequiredOptionalRequest waiRequest requestHeadergetRequestBodyChunk httpVersionisSecurepathInfo queryString remoteHostrequestBodyLengthrequestHeaders requestMethodResponseresponseStatusresponseHeaders responseBody toWaiResponse $fEqResponse $fOrdResponse$fShowResponse HaveTraits MissingTraitHasTraitfromLinkedunlinkSetsGetsSetsetTraitGetgetTrait TraitAbsenceAbsenceTrait Attributelinkzero linkminusprobeplantpick $fHasTraitt: $fHasTraitt:0 $fHasTraitt[] RouteMismatchSummary getSummary DescriptiongetDescription MiddlewareRequestHandlerHandlerarrM consumeRoutesetDescription setSummary RoutePath routeMismatchunlinkA$fIsListRoutePath$fMonoidRouteMismatch$fSemigroupRouteMismatch$fShowRouteMismatch$fEqRouteMismatch$fOrdRouteMismatch $fEqSummary $fOrdSummary $fShowSummary $fReadSummary$fIsStringSummary$fEqDescription$fOrdDescription$fShowDescription$fReadDescription$fIsStringDescription$fShowRoutePath $fEqRoutePathOptionalHeaderRequiredHeaderHeaderHeaderParseErrorHeaderNotFoundheaderoptionalHeader lenientHeaderoptionalLenientHeader setHeadersetOptionalHeader$fTraitTYPEHeaderResponse$fTraitTYPEHeaderResponse0$fTraitAbsenceTYPEHeaderRequest$fTraitTYPEHeaderRequest $fTraitAbsenceTYPEHeaderRequest0$fTraitTYPEHeaderRequest0 $fTraitAbsenceTYPEHeaderRequest1$fTraitTYPEHeaderRequest1 $fTraitAbsenceTYPEHeaderRequest2$fTraitTYPEHeaderRequest2$fReadHeaderParseError$fShowHeaderParseError$fEqHeaderParseError$fReadHeaderNotFound$fShowHeaderNotFound$fEqHeaderNotFoundMethodMismatchexpectedMethod actualMethodMethodmethod$fTraitTYPEMethodRequest$fTraitAbsenceTYPEMethodRequestPathEnd PathVarErrorPathVarNotFoundPathVarParseErrorPathVarPathpathpathVarpathEnd$fTraitAbsenceTYPEPathRequest$fTraitTYPEPathRequest$fTraitTYPEPathVarRequest $fTraitAbsenceTYPEPathVarRequest $fTraitAbsenceTYPEPathEndRequest$fTraitTYPEPathEndRequest$fEqPathVarError$fShowPathVarError$fReadPathVarErrorParamParseError ParamNotFoundOptionalQueryParamRequiredQueryParam QueryParam queryParamoptionalQueryParamlenientQueryParamoptionalLenientQueryParam#$fTraitAbsenceTYPEQueryParamRequest$fTraitTYPEQueryParamRequest$fTraitTYPEQueryParamRequest0$fTraitTYPEQueryParamRequest1$fTraitTYPEQueryParamRequest2$$fTraitAbsenceTYPEQueryParamRequest0$$fTraitAbsenceTYPEQueryParamRequest1$$fTraitAbsenceTYPEQueryParamRequest2$fReadParamParseError$fShowParamParseError$fEqParamParseError$fReadParamNotFound$fShowParamNotFound$fEqParamNotFoundStatus mkResponse continue100switchingProtocols101ok200 created201 accepted202nonAuthoritative203 noContent204resetContent205partialContent206multipleChoices300movedPermanently301found302 seeOther303notModified304temporaryRedirect307permanentRedirect308 badRequest400unauthorized401paymentRequired402 forbidden403 notFound404methodNotAllowed405notAcceptable406proxyAuthenticationRequired407requestTimeout408 conflict409gone410lengthRequired411preconditionFailed412requestEntityTooLarge413requestURITooLong414unsupportedMediaType415requestedRangeNotSatisfiable416expectationFailed417 imATeapot418unprocessableEntity422preconditionRequired428tooManyRequests429requestHeaderFieldsTooLarge431internalServerError500notImplemented501 badGateway502serviceUnavailable503gatewayTimeout504httpVersionNotSupported505 networkAuthenticationRequired511$fTraitTYPEStatusResponseJSONBodyBody requestBodyjsonRequestBody'jsonRequestBodysetBodysetBodyWithoutContentType setJSONBody' setJSONBodysetJSONBodyWithoutContentTyperespondA respondJsonA respondJsonA'$fTraitTYPEBodyResponse$fTraitAbsenceTYPEBodyRequest$fTraitTYPEBodyRequest$fTraitTYPEJSONBodyResponse!$fTraitAbsenceTYPEJSONBodyRequest$fTraitTYPEJSONBodyRequest AuthToken authScheme authTokenRealmAuthorizationHeadergetAuthorizationHeaderTraitrespondUnauthorized$fFromHttpApiDataAuthToken $fEqRealm $fOrdRealm $fShowRealm $fReadRealm$fIsStringRealm JWTAuthErrorJWTAuthHeaderMissingJWTAuthSchemeMismatchJWTAuthTokenBadFormatJWTAuthAttributeErrorJWTAuthJWTAuth'#$sel:jwtValidationSettings:JWTAuth'$sel:jwkSet:JWTAuth'$sel:toJWTAttribute:JWTAuth'jwtAuthoptionalJWTAuthjwtAuth'optionalJWTAuth'!$fTraitAbsenceTYPEJWTAuth'Request$fTraitTYPEJWTAuth'Request$fTraitTYPEJWTAuth'Request0"$fTraitAbsenceTYPEJWTAuth'Request0$fEqJWTAuthError$fShowJWTAuthErrorBasicAuthErrorBasicAuthHeaderMissingBasicAuthSchemeMismatchBasicAuthCredsBadFormatBasicAuthAttributeError Credentials$$sel:credentialsUsername:Credentials$$sel:credentialsPassword:CredentialsPasswordUsername BasicAuth BasicAuth' $sel:toBasicAttribute:BasicAuth' basicAuth basicAuth'optionalBasicAuthoptionalBasicAuth'#$fTraitAbsenceTYPEBasicAuth'Request$fTraitTYPEBasicAuth'Request$fTraitTYPEBasicAuth'Request0$$fTraitAbsenceTYPEBasicAuth'Request0$fEqBasicAuthError$fShowBasicAuthError$fReadBasicAuthError$fEqCredentials$fOrdCredentials$fShowCredentials$fReadCredentials $fEqPassword $fOrdPassword$fShowPassword$fReadPassword$fIsStringPassword $fEqUsername $fOrdUsername$fShowUsername$fReadUsername$fIsStringUsernameserveDir serveFile StdHandler wai-3.2.3-5ivWGf34hrr1mAyLB2VOGJNetwork.Wai.Internalbase Control.Arrow ArrowChoice ArrowPlus GHC.MaybeNothingghc-prim GHC.TypesInt Data.EitherEithertext-2.0-1Q39dVtB9SgGnSFuJBE6QZData.Text.InternalTextControl.Category>>>Kleisli runKleisli+++left|||rightemptyleftApp^<<<<^>>^^>>returnAArrow&&&second***arrfirst ArrowZero zeroArrow<+> ArrowApplyapp ArrowMonad ArrowLooploop<<< Data.Textcopy stripSuffixcommonPrefixes stripPrefix isInfixOf isSuffixOf isPrefixOfunwordsunlineslineswordszipWithzipcount findIndexindex breakOnAll breakOnEndbreakOnfilter partitionfindelemchunksOfsplitsplitOntailsinitsgroupgroupBybreakspansplitAtstripstripEnd stripStart dropAround dropWhileEnd dropWhile takeWhileEnd takeWhiledropEnddroptakeEnd measureOfftakeunfoldrNunfoldr replicate mapAccumR mapAccumLscanr1scanrscanl1scanlminimummaximumallany concatMapconcatfoldr1foldrfoldl1'foldl1foldl'foldl transposecenter justifyRight justifyLefttoTitletoUppertoLower toCaseFoldreplacereverse intersperse intercalatemap compareLengthlengthnullunsnocinittaillastunconsheadsnocconspackData.Text.Show singletonunpackCStringAscii#unpackCString#unpackappend