{ pkgs ? import sources.nixpkgs {
    overlays = [
      (import ./pkgs { })
      (self: super: {
        haskell = super.haskell // {
          packageOverrides = self.lib.composeManyExtensions [
            super.haskell.packageOverrides
            (self: super: {
              ghcWithPackages = super.ghcWithPackages.override {
                installDocumentation = false; # XXX true (default)
              };
            })
          ];
        };
      })
    ];
  }
, sources ? import ./nix/sources.nix
}:
let
  haskellPackages = pkgs.haskell.packages.ghc910;
  jsHaskellPackages = pkgs.pkgsCross.ghcjs.haskell.packages.ghc910;
  lib = pkgs.lib;
in
rec {
  inherit (haskellPackages) acms;
  inherit (jsHaskellPackages) frontend;
  shell = pkgs.mkShell {
    inputsFrom = [
      (jsHaskellPackages.shellFor {
        packages = _: [
          jsHaskellPackages.acms
          jsHaskellPackages.autotypes
          jsHaskellPackages.frontend
        ];
      })
      (haskellPackages.shellFor {
        packages = _: [
          haskellPackages.acms
          haskellPackages.autotypes
          haskellPackages.frontend
        ];
        withHoogle = true;
        withHaddock = true;
      })
      (pkgs.mkShell {
        buildInputs = [
          haskellPackages.astore
          haskellPackages.autotypes
          haskellPackages.cabal-install
          haskellPackages.haskell-language-server
          haskellPackages.ormolu
          pkgs.niv
          pkgs.pkg-config
          (pkgs.writeScriptBin "reload" ''
            set -efu
            ${haskellPackages.ghcid.bin}/bin/ghcid -c \
              '${haskellPackages.cabal-install}/bin/cabal new-repl' \
              -T ':run Main.main'
          '')
          (pkgs.writeScriptBin "acms" ''
            set -efu
            exec ${haskellPackages.cabal-install}/bin/cabal run acms -- "$@"
          '')
          (pkgs.writeScriptBin "format" ''
            set -efu
            git ls-files | grep .hs$ | while read -r fn; do
              ${haskellPackages.ormolu}/bin/ormolu -i "$fn" || :
            done
          '')
          (pkgs.writeScriptBin "git-hook-precommit" ''
            set -efux
            cd ${lib.escapeShellArg (toString ./.)}
            nix-build . -A acms -A frontend --no-out-link
            nix-build tests.nix --no-out-link
          '')
        ];
        shellHook = ''
          export EM_CACHE="${toString ./.}/.emcache" # nixos/nixpkgs#282509
        '';
      })
    ];
  };
}