This is a utility that provides a variety of statistics about your Haskell project. These include:
- A list of type signatures that are shared among multiple locally defined functions, enumerating those functions along with their definition sites.
- Lists of the most used and least used definitions in the project.
- A breakdown of local definitions, telling you the number of each type of definition as well as how many lines of code they take up.
Install with stack update && stack install inventory
or cabal update && cabal install inventory
. The version used to compile inventory
must be the
same as the version used to compile your project. For stack users, this means
you may have to stack install
from within your project to use the right GHC.
Inventory uses .hie
files to gather information about all haskell files in
the project. Once you have generated .hie
files for your project, execute
inventory
from your project's root.
Add this to your cabal.project.local
file:
package *
ghc-options: -fwrite-ide-info -hiedir=.hie
Then do a full rebuild of the project:
cabal clean
cabal build all
Add this to your stack.yaml
file:
ghc-options:
"$locals": -fwrite-ide-info
-hiedir=.hie
Then do a full rebuild:
stack clean
stack build
By default inventory
looks for HIE files in the .hie
directory. You can
override this using the HIE_DIR
environment variable: HIE_DIR=path/to/dir inventory
.
Here are some excerpts of the output that was produced by running inventory
on the stack
codebase:
The output for matching signatures can be useful for discovering functions that
are duplicates of one another. For instance, the packageIdent
and
packageIdentifier
functions in the above output turned out to be duplicates.
- Context such as constraints and foralls do not appear in the printed type signatures for GHC versions less than 9.0.1.
- Standalone kind signatures are not yet included in definition counts.
- Does not unfold type synonyms when comparing type signatures.
- GHC versions less than 8.8.x are not supported.