úÎ3µ2[     None¾In order to make splice definitions more functional, we declare them and the attributes they need, along with deserialization (if needed). The deserialization is facilitated be this class.+In order to have render be able to get the 0 out of our context, we need this helper class.´The type of our splice (compiled version). We need a StateT to be able to pass the runtime context (which includes the current request) into the splice (and sometimes modify it).·The type of our splice (interpreted version). We need a StateT to be able to pass the runtime context (which includes the current request) into the splice (and sometimes modify it).‡The type of our state. We need a StateT to be able to pass the runtime context (which includes the current request) into the splices.’Initialize heist. This takes a list of paths to template directories, a set of interpreted splices, and a set of compiled splices (you can pass mempty as either)ÑRender interpreted templates according to the request path. Note that if you have matched some parts of the path, those will not be included in the path used to find the templates. For example, if you have  foo/bar.tpl3 in the directory where you loaded templates from, path "foo" ==> heistServe Will match  foo/foo/bar , but not foo/bar. To match that, you could: anything ==> heistServe\This will also try the path followed by "index" if the first doesn't match, so if you have  foo/index.tpl , the path foo will be matched to it.4If no template is found, this will continue routing. 3Render a single interpreted heist template by name. KRender a template, and add additional interpreted splices before doing so. 0Render a single compiled heist template by name. Like , but for compiled templates. ÿThis declares a new splice. Given a name, an attribute matcher, and a handler function (which takes the context, the node, and the specified attributes), it will pass the handler function the provided attributes or return nothing, if the attributes are missing / not deserializable.ÑNote that due to the dynamism (the handler function can have any number of arguments, and the number / type of them is based on the matcher), the types of this may be a little confusing (in particular, the k‹ contains a lot). This continuation-based style lets us achieve this style, but the types suffer. It may be easier to see via an example: E tag "posts" (attr "num" & attr "sort") $ \ctxt node num sort -> ... A tag with no attributes.$This combines two matchers together.gThis specifies that an attribute should be present and convertable to the type indicated by it's type.NThis specifies that an attribute is optional - if absent or not convertable,  will be passed.    NoneL`This function runs a form and passes the function in it's last argument the result, which is a j and an optional result. If the request is a get, or if the form failed to validate, the result will be ; and you should render the form (with the errors from the ).      !'fn-extra-0.3.0.2-31iid6B17hdEvfOle9Wl4EWeb.Fn.Extra.HeistWeb.Fn.Extra.Digestive FromAttribute fromAttribute HeistContextgetHeist FnCSpliceFnSplice FnHeistState heistInit heistServerenderrenderWithSplicescRender cHeistServetagtag'&=attrattrOpt$fFromAttributeDouble$fFromAttributeInt$fFromAttributeTextrunFormbaseGHC.BaseNothing1digestive-functors-0.8.2.0-Fdt5UwNh3Pg3BmhFFTnA71Text.Digestive.ViewView queryFormEnvrequestFormEnv