let
  # import niv packages
  sources = import ./nix/sources.nix;
  overlay = _: pkgs:
    { niv = import sources.niv {};    # use the sources :)
    };

  pkgs1 = import sources.nixpkgs {
    overlays = [ overlay ];
    config = {};
    #import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz)
  };
  # Import the Haskell.nix library,
  pkgs2 = import <nixpkgs>
    (import (builtins.fetchTarball https://github.com/input-output-hk/haskell.nix/archive/master.tar.gz))
    ;

  pkgs = pkgs1 // pkgs2;

  cabal-doctest = (hackage: {
    cabal-doctest = hackage.cabal-doctest."1.0.8".revisions.default;
  });
  gtk2hs-buildtools = (hackage: {
    gtk2hs-buildtools = hackage.gtk2hs-buildtools."0.13.8.0".revisions.default;
  });
  hashtables = (hackage: {
    hashtables = hackage.hashtables."1.2.3.4".revisions.default;
  });
  alex = (hackage: {
    alex = hackage.alex."3.2.5".revisions.default;
  });
  happy = (hackage: {
    happy = hackage.happy."1.19.12".revisions.default;
  });

  # Import the file you will create in the stack-to-nix or cabal-to-nix step.
  my-pkgs = import ./pkgs.nix;

  # Cabal projects use this:
  pkgSet = pkgs.haskell-nix.mkCabalProjectPkgSet {
    plan-pkgs = my-pkgs;
    pkg-def-extras = [
      cabal-doctest
      gtk2hs-buildtools
      hashtables
      alex
      happy
    ];
    modules = [
      # specific package overrides would go here
      # example:
      #  packages.cbors.package.ghcOptions = "-Werror";
      #  packages.cbors.patches = [ ./one.patch ];
      #  packages.cbors.flags.optimize-gmp = false;
      # It may be better to set flags in `cabal.project` instead
      # (`plan-to-nix` will include them as defaults).
    ];
  };

in pkgSet.config.hsPkgs //
  { _config = pkgSet.config; }
