{ pkgs, stdenv, lib, self }:

let
  discoPkgs = pkgs.recurseIntoAttrs self.packages.${stdenv.system};
  discoDrvs = lib.filterAttrs (_: value: lib.isDerivation value) discoPkgs;
  filterDrvs = inputs:
    lib.filter
      (drv:
        !(lib.hasAttr "pname" drv) ||
        drv.pname == null ||
        !(lib.any
          (name: name == drv.pname || name == drv.name)
          (lib.attrNames discoDrvs)))
      inputs;
in
(pkgs.mkShell {
  OCAMLRUNPARAM = "b";
  inputsFrom = lib.attrValues discoDrvs;
  buildInputs = with pkgs; [
    ocamlPackages.ocaml-lsp
    ocamlformat
    ocamlPackages.merlin
    ocamlPackages.utop
    ffmpeg
    youtube-dl
  ] ++ lib.optionals stdenv.isDarwin [ fswatch ];
  propagatedBuildInputs = with pkgs.ocamlPackages; [
    alcotest
    qcheck
    qcheck-alcotest
  ];
}).overrideAttrs (o: {
  propagatedBuildInputs = filterDrvs o.propagatedBuildInputs;
  buildInputs = filterDrvs o.buildInputs;
})