ce42b372

Say what a path is

First of the stack. #13, #11 and #12 sit on this.

A `FilePath` is a `String`, so nothing about it says whether it holds a file or a directory, whether it is absolute or relative, or whether it is a path at all. The specs here named one twenty times: `resourceDir` was a `String` in eight of them, and three separate copies of `rootAt` took one.

They take `path`'s `Path` now, and ask `path-io` for the listings. Where a library wants a `String` it gets `toFilePath` at the call, which is the one place a path should be spelled that way.

## Three things that fell out

**`hopinion-gen` no longer depends on `directory`.** `listDirRel` answers with the directories and the files already told apart, which is what every one of these listings wanted. Several assertions that compared sorted strings now compare `Path` values and say which kind they expected:

```haskell
-- before
entries <- listDirectory resourceDir
sort entries `shouldBe` ["every-kind.golden", "failure.golden", "repo"]

-- after
(dirs, files) <- listDirRel resourceDir
sort dirs   `shouldBe` [[reldir|repo|]]
sort files  `shouldBe` [[relfile|every-kind.golden|], [relfile|failure.golden|]]
```

**`Project.hs` compared a directory's name against two words.** It compares directories now, so the trailing separator that made `dropTrailingPathSeparator` necessary is not in the way.

**sydtest moves to 0.30.0.0**, where `scenarioDir` hands over a `Path Rel File` rather than a `FilePath`. That is what the two scenario-driven specs needed, and it is why the pin moves in a commit that otherwise only touches this repository. NorfairKing/sydtest#137.

## No rule yet

Nothing enforces any of this here. That is #13, and it is separate because this is a change to existing code and that one is not: after this, #13 adds a rule file, the fact it reads, and its test resources, and touches nothing that already existed bar the line that registers it.

178 tests, unchanged in count: nothing here adds or removes a test, it retypes what they pass around.

## Review loop

```
nix flake check
nix develop --command cabal test hopinion-test --test-options="--ai-executor"
```

Suite timing

Time to Start Worker time Duration Time to finish Idle
Config 0s 1s 1s 1s 0s
Eval 1s 8s 8s 9s 0s
Build 9s 0s 0s 9s 0s
Suite 0s 9s 9s 9s 0s

Timeline

0s0s