For all big page reloads, we want the `<head>` of the page to start being transmitted even while doing database requests. So let’s use the `Wai.ResponseStream` to do exactly that. The handler provides the contents of `<head>`, we start streaming that, meanwhile it calculates the `<body>` and once that is ready transmits it. This means we can load all our static resources before the page even starts sending any body data, meaning the css and html is already there when we reach `</html>`. Sweet. The `<title>` in `artistPage` was depending on the table data, so I moved it into a separate SELECT. We can do all of it in parallel as well. Sweet. ~~~ This also adds static file prefetching of source maps if provided. Change-Id: Ib824430594733b4c8e86ee1096c8afba2df1a66d Reviewed-on: https://cl.tvl.fyi/c/depot/+/13221 Reviewed-by: Profpatsch <mail@profpatsch.de> Tested-by: BuildkiteCI |
||
|---|---|---|
| .. | ||
| src | ||
| default.nix | ||
| my-prelude.cabal | ||
| README.md | ||
My Haskell Prelude
Contains various modules I’ve found useful when writing Haskell.
Contents
A short overview:
MyPrelude.hs
A collection of re-exports and extra functions. This does not replace the Prelude module from base, but rather should be imported in addition to Prelude.
Stuff like bad functions from prelude (partial stuff, or plain horrible stuff) are handled by a custom .hlint file, which you can find in ../.hlint.yaml.
The common style of haskell they try to enable is what I call “left-to-right Haskell”,
where one mostly prefers forward-chaining operators like &/<&>/>>= to backwards operators like $/<$>/<=<. In addition, all transformation function should follow the scheme of aToB instead of B.fromA, e.g. Text.unpack/Text.pack -> textToString/stringToText. Includes a bunch of text conversion functions one needs all the time, in the same style.
These have been battle-tested in a production codebase of ~30k lines of Haskell.
Label.hs
A very useful collection of anonymous labbeled tuples and enums of size 2 and 3. Assumes GHC >9.2 for RecordDotSyntax support.
Pretty.hs
Colorful multiline pretty-printing of Haskell values.
Test.hs
A wrapper around hspec which produces colorful test diffs.
Aeson.hs
Helpers around Json parsing.
Data.Error.Tree
Collect errors (from Data.Error) into a tree, then display them in a nested fashion. Super useful for e.g. collecting and displaying nested parsing errors.
RunCommand.hs
A module wrapping the process API with some helpful defaults for executing commands and printing what is executed to stderr.