{ overlays ? [] }:
let
  sources = import ./sources.nix;
  settings = import ./settings.nix;

  overlay = final: prev: {
    haskell = prev.haskell // {
      packages = prev.haskell.packages // {
        "${settings.ghc}" = prev.haskell.packages."${settings.ghc}".override {
          overrides = haskellOverlay prev;
        };
      };
    };
  };

  haskellOverlay = pkgs: final: prev: {
    attoparsec-iso8601 = prev.attoparsec-iso8601_1_1_0_0;
    http-api-data = prev.http-api-data_0_5;
    servant = pkgs.haskell.lib.doJailbreak prev.servant;
    servant-server = pkgs.haskell.lib.doJailbreak prev.servant-server;
    unicode-data = prev.unicode-data_0_4_0_1;
    unicode-data-names = pkgs.haskell.lib.markUnbroken prev.unicode-data-names;
  };
in
  import sources.nixpkgs { overlays = overlays ++ [overlay]; }