The build, before there is anything to build
The build, and nothing that uses it yet.
First of five. Each one adds a rule and exactly the machinery that rule needs,
and each passes `nix flake check` on its own.
## What is here
16 files, 706 lines.
- `flake.nix`: the dev shell, `release`, `hlint-check`, `weeder-check`, and the
pre-commit hooks (hpack, cabal2nix, ormolu, nixpkgs-fmt).
- `.hlint.yaml`: partial functions banned, an allowlist of language extensions,
`Data.ByteString.Char8` refused, lazy `foldr` and `modifyIORef` refused.
- `weeder.toml`, `cabal.project`, `stack.yaml`, `.envrc`, `.gitignore`.
- `hopinion`: a library with one function that prints that it has no rules, and
an executable that calls it. It is here so that none of the checks above is
vacuous.
Nothing parses Haskell. Nothing decides anything.
## The one thing worth arguing about
The warnings live in `package.yaml` rather than in the overlay, so a `cabal
build` in the dev shell says what a Nix build would; the overlay adds `-Werror`
on top. That makes the difference between a warning and a failure a property of
how it is built rather than of what it is.
`-Wunused-packages` and `weeder` are in that set deliberately. They are what
will keep every later PR to the machinery its rule actually needs: on the next
one they removed 14 dependencies, 13 definitions and a dozen imports that had
stopped being used.
## Review loop
```
nix flake check
```