# Derived from: https://github.com/jonascarpay/template-haskell
# More info here: https://jonascarpay.com/posts/2021-01-28-haskell-project-template.html

{
  description = "hello";

  inputs.haskellNix.url = "github:input-output-hk/haskell.nix";
  inputs.nixpkgs.follows = "haskellNix/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs =
    {
      nixpkgs,
      flake-utils,
      haskellNix,
    }:
    flake-utils.lib.eachDefaultSystem (
      system:
      let
        overlay = self: _: {
          hsPkgs = self.haskell-nix.project' rec {
            src = ./.;
            compiler-nix-name = "ghc8107";
            shell = {
              tools = {
                cabal = "latest";
                ghcid = "latest";
                haskell-language-server = "latest";
                hlint = "latest";
                # See https://github.com/input-output-hk/haskell.nix/issues/1337
                ormolu = {
                  version = "latest";
                  modules = [
                    (
                      { lib, ... }:
                      {
                        options.nonReinstallablePkgs = lib.mkOption { apply = lib.remove "Cabal"; };
                      }
                    )
                  ];
                };
              };
              ## ormolu that uses ImportQualifiedPost.
              ## To use, remove ormolu from the shell.tools section above, and uncomment the following lines.
              # buildInputs =
              #   let
              #     ormolu = pkgs.haskell-nix.tool compiler-nix-name "ormolu" "latest";
              #     ormolu-wrapped = pkgs.writeShellScriptBin "ormolu" ''
              #       ${ormolu}/bin/ormolu --ghc-opt=-XImportQualifiedPost $@
              #     '';
              #   in
              #   [ ormolu-wrapped ];
            };
          };
        };
        pkgs = import nixpkgs {
          inherit system;
          overlays = [
            haskellNix.overlay
            overlay
          ];
        };
        flake = pkgs.hsPkgs.flake { };
      in
      flake // { defaultPackage = flake.packages."hello:exe:hello-exe"; }
    );
}