{
  lib,
  fetchurl,
  ocaml,
  buildDunePackage,
}:

let
  params =
    if lib.versionAtLeast ocaml.version "4.08" then
      {
        version = "1.3.4";
        hash = "sha256-Hb8FHp9oV03ebi4lSma5xSTKQl6As26Zr5btlkq2EMM=";
      }
    else
      {
        version = "1.3.2";
        hash = "sha256-NEDCuILVN65ekBHrBqu1P1Zn5lHqS7O0YOqCMPqMGSY=";
      };
in

buildDunePackage rec {
  pname = "easy-format";
  inherit (params) version;

  src = fetchurl {
    url = "https://github.com/ocaml-community/easy-format/releases/download/${version}/easy-format-${version}.tbz";
    inherit (params) hash;
  };

  doCheck = true;

  meta = {
    description = "High-level and functional interface to the Format module of the OCaml standard library";
    longDescription = ''
      This module offers a high-level and functional interface to the Format module of
      the OCaml standard library. It is a pretty-printing facility, i.e. it takes as
      input some code represented as a tree and formats this code into the most
      visually satisfying result, breaking and indenting lines of code where
      appropriate.

      Input data must be first modelled and converted into a tree using 3 kinds of
      nodes:

      * atoms
      * lists
      * labelled nodes

      Atoms represent any text that is guaranteed to be printed as-is. Lists can model
      any sequence of items such as arrays of data or lists of definitions that are
      labelled with something like "int main", "let x =" or "x:".
    '';
    homepage = "https://github.com/ocaml-community/easy-format";
    changelog = "https://github.com/ocaml-community/easy-format/releases/tag/${params.version}";
    license = lib.licenses.bsd3;
    maintainers = with lib.maintainers; [ vbgl ];
  };
}