2021-01-02: Libraries I use

Here is a list of libraries or tools that I use. The list is written using a template in Artyom's blog.

I hope to update the list weekly and publish updates monthly.

AreaWhat and why
Build toolsNix + cabal
Nix + cabal gives me the best user experience so far. Allows easily switch the versions. Freeze versions and have a reproducible built environment on different OS-es. Besides, nix allows to set up the entire developer environment, including tools, external programs, databases, shell scripts.
EditorVim (no plugins) / Idea (no haskell plugins)
My editor/environment is far from the one I want to advertise. Even though editors greatly improved in the Haskell ecosystem, I still not ready to invest time into setting up my environment. Just use a simple setup with no plugins; this setup at least does not harm my workflow. It's also easy to use it for work on a remote machine.
IntelliJ Idea has great non-Haskell plugins I'm very fond of
FormatterNone, just none
Preludeprelude from base/custom prelude in the project with required reexports
Most of the preludes have very opinionated choices I don't want to deal with
List functions

Data.List + containers + own Data.List.Extra + split
The most useful functions exist in the container package; however, sometimes, I need project-specific ones; in that case, I introduce Data.List.Extra module to share them.

I want to highlight here that I find lists very useful data structure, the one that you can write very effective and simple to understand algorithms, just make sure the lists are not materialised too much.


generic-lens provides a nice API for accessing fields without extra boilerplate. I addition you can define your own definitions to introduce additional labels for the structures.
Anonymous recordsnone. for JSON structures I use aeson-injector, but it's not full-featured anonymous records 
JSONaeson + lens-aeson
I'm not always happy with aeson, but it reasonably does it's job


It's just a standard library for YAML, works quite nice, doesn't require anything except declaring aeson instances

A good library with bi-directional parsing support, that can save you when you need both parser and serializer, and they should be compatible. It may be a pain otherwise. I was not convinced that TOML format in way forward format for me in my experiments, so I never had a too deep look.
Configurationyaml + environment variables
For configuration, I usually use YAML files, and more often environment files. Env works great in combination with external tooling. Experiments with TOML files didn't show measurable benefit over YAML files
Filepathdirectory, filepath
File manipulation and scriptingtyped-process
process library has some quirks, so if you try to implement the nice and simple solution you'll reimplement typed-process, so it's easier to use it.
Command-line argumentsoptparse-applicative
you may use optparse-generic as a quick start but quite soon you'll need the full set of optparse-applicative features.
Streamingstreaming, conduit
I love streaming for simplicity, but sometimes there are too many conduit based libraries around, so it's easier to use that
HTML generationblaze-html (historically)
I don't remember any good reason for not moving to lucid, for example, but blaze-HTML works for me
Servingservant + servant-generic
Looks like a standard and is head and shoulders over its competitors. 
Sometimes when I don't need the full power of servant I use wai directly
HTTP requestshttp-client -> http-conduit
I used the lowest-level libraries because they work, and you never try to overcome the obstacles introduced by the "safer" API interfaces.
Besides I've experimented a bit on wreq It fits 95% use cases, so can suggest that as a starter, but I'm not ready for the shift in my projects.
Downloading fileshttp-client with streaming
PostgreSQL hasql
A great library that uses raw SQL and doesn't try to introduce features that do not work well.
loggingcheops-logger (co-log-concurrent + co-log-json + co-log-core)
Do not puzzle with co-log; it's a combination of libraries that allow you to dump structured logs in a JSON format
mapcontainers, rarely unordered-containers (historically)
benchmarkingcriterion (historically)
parsingattoparsec, slowly shifting to megaparsec
concurrencyasync, raw STM
randomnessrandom>1.12; tf-random
S3 compatible storageminio-hs
A nice library that works (usually)
telegram APItelegram-bot-simple
metricsMy fork of prometheus with prometheus-extra

Prometheus is almost a standard and can be easily integrated with external tooling. The extra package provides some new primitives with some more effective and others that provide useful statistics.
CSV handingcassava

Pretty fast library with an easy to use API.
resource handingresourcet, resource-pool
Effects handinghandle pattern + transformers
zip files handlingzip (sometimes typed-process + zip/unzip system packages).
vectors handlingvector and vector-algorithms
error handling and validationmonad-chronicle
JWT manipulationjose, + own wrappers that allow operating on unverified jwt 
time-based cachinglazy-cache
time library??? (clock, thyme, time)
problems everywhere...
Redis clienthedis

standard de-facto, questionable API, but it works
templatingede -  a nice powerful and extensible templating engine, introduces its own template language
Dedicated post about ED-E package.
environment parserown, but can suggest trying envy
base64base64 an efficient library that works for many byte and text types
emailHaskellNet for sending emails
email-validate — for address validation


2021-01-02: Initial layout
2021-01-10: add base64
2021-01-17: add HaskellNet and email-validate