{
  inputs = {
    nixpkgs.url = github:nixos/nixpkgs/nixpkgs-unstable;
    flake-utils.url = github:numtide/flake-utils;
    nix-filter.url = github:numtide/nix-filter;
    language-c = {
      url = github:kalhauge/language-c;
      flake = false;
    };
    hspec-glitter.url = "/Users/chrg/Develop/repos/hspec-glitter";
  };
  outputs = {
    self,
    nixpkgs,
    flake-utils,
    nix-filter,
    ...
  } @ inputs: let
    load = final: p: n: {
      "${n}" =
        final.haskell.lib.overrideCabal
        (p.callCabal2nixWithOptions n (nix-filter.lib {root = "${self}/${n}";}) "" {}) {
          doCheck = true;
        };
    };
    packages = final: p:
      {
        "language-c" =
          final.haskell.lib.overrideCabal
          (p.callCabal2nixWithOptions "language-c" inputs.language-c "" {}) {
            doCheck = false;
          };
      }
      // load final p "rtree"
      // load final p "rtree-c";
    overlays = final: prev: {
      haskellPackages = prev.haskellPackages.extend (p: _: packages final p);
    };
  in
    {
      overlays.default = overlays;
    }
    // flake-utils.lib.eachDefaultSystem
    (system: let
      hpkgs =
        (import nixpkgs {
          inherit system;
          overlays = [inputs.hspec-glitter.overlays.default overlays];
        })
        .haskellPackages;
    in rec {
      packages = {
        default = hpkgs.rtree-c;
        rtree = hpkgs.rtree;
        rtree-c = hpkgs.rtree-c;
      };
      devShells = let
        nativeBuildInputs = with hpkgs; [
          cabal-install
          ghcid
          haskell-language-server
          hpack
          fourmolu
          hspec-golden
        ];
        withHoogle = true;
      in {
        default =
          hpkgs.shellFor
          {
            name = "rtree-shells";
            packages = p: [
              p.rtree
              p.rtree-c
            ];
            doBenchmark = true;
            doCheck = true;
            inherit nativeBuildInputs withHoogle;
          };
      };
    });
}