{
  stdenv,
  lib,
  fetchurl,
  ocaml,
  findlib,
  ocamlbuild,
  topkg,
  result,
}:

lib.throwIfNot (lib.versionAtLeast ocaml.version "4.07")
  "rresult is not available for OCaml ${ocaml.version}"

  stdenv.mkDerivation
  rec {
    pname = "ocaml${ocaml.version}-rresult";
    version = "0.7.0";
    src = fetchurl {
      url = "https://erratique.ch/software/rresult/releases/rresult-${version}.tbz";
      sha256 = "sha256-Eap/W4NGDmBDHjFU4+MsBx1G4VHqV2DPJDd4Bb+XVUA=";
    };

    nativeBuildInputs = [
      ocaml
      findlib
      ocamlbuild
      topkg
    ];
    buildInputs = [ topkg ];

    propagatedBuildInputs = [ result ];

    strictDeps = true;

    inherit (topkg) buildPhase installPhase;

    meta = {
      license = lib.licenses.isc;
      homepage = "https://erratique.ch/software/rresult";
      description = "Result value combinators for OCaml";
      maintainers = [ lib.maintainers.vbgl ];
      inherit (ocaml.meta) platforms;
    };
  }