let
  haskellNixSrc = builtins.fetchTarball
      https://github.com/input-output-hk/haskell.nix/archive/e3933cbb701e5bc61c18f620a4fd43c55f5c026e.tar.gz;
  haskellNix = import haskellNixSrc { version = 2; };
  nixpkgsSrc = haskellNix.sources.nixpkgs-2105;
in
{ nixpkgs ? import nixpkgsSrc haskellNix.nixpkgsArgs
, ghc-ver ? "ghc8107"
, index-state ? "2021-07-01T00:00:00Z"
, index-sha256 ? null
, plan-sha256 ? null
, materialized ? null
}:
with nixpkgs;
let
  gitignoreSrc = nixpkgs.fetchFromGitHub {
    owner = "hercules-ci";
    repo = "gitignore.nix";
    rev = "c4662e662462e7bf3c2a968483478a665d00e717";
    sha256 = "sha256:1npnx0h6bd0d7ql93ka7azhj40zgjp815fw2r6smg8ch9p7mzdlx";
  };
  inherit (import gitignoreSrc { inherit (nixpkgs) lib; }) gitignoreFilter;
  cleanedSource = nixpkgs.lib.cleanSourceWith {
    name = "hxtools";
    src = ./.;
    filter = p: t:
      let baseName = baseNameOf (toString p);
      in gitignoreFilter ./../.. p t
      && baseName != ".gitignore"
      && baseName != "nix"
      && baseName != "ci-out"
      && (builtins.match ".*\.nix" baseName == null);
  };
  sdist = nixpkgs.stdenvNoCC.mkDerivation {
    name = "hxtools" + "-sdist";
    src = cleanedSource;
    buildInputs = [ nixpkgs.bash nixpkgs.cabal-install ];
    phases = [ "unpackPhase" "buildPhase" ];
    buildPhase = ''
      mkdir -p $out
      cabal sdist -o $out
    '';
  };
  sdist-unpacked = nixpkgs.stdenvNoCC.mkDerivation {
    name = "hxtools" + "-sdist-unpacked";
    src = cleanedSource;
    buildInputs = [
      nixpkgs.bash
      nixpkgs.gnutar
    ];
    phases = [ "buildPhase" ];
    buildPhase = ''
      mkdir -p "$out"
      tar -xz -f "${sdist}"/*.tar.gz --strip-components=1 -C "$out"
      for f in "$src"/stack*.yaml; do cp "$f" "$out"; done
    '';
  };
  package-nix = nixpkgs.haskell-nix.callCabalProjectToNix {
    src = sdist-unpacked;
    inherit index-state index-sha256 plan-sha256 materialized;
    compiler-nix-name = ghc-ver;
  };
  package-plan = nixpkgs.haskell-nix.importAndFilterProject { inherit (package-nix) projectNix sourceRepos src; };
  hsPkgs =
    let pkg-set = nixpkgs.haskell-nix.mkCabalProjectPkgSet
              { plan-pkgs = package-plan;
                modules = [
                  { ghc.package = nixpkgs.haskell-nix.compiler.${ghc-ver}; }
                  { packages.hxtools.src = nixpkgs.haskell-nix.cleanSourceHaskell { src = cleanedSource; }; }
                ];
              };
    in pkg-set.config.hsPkgs;
in hsPkgs.hxtools.components.exes