{
  inputs = {
    nixpkgs.url = github:nixos/nixpkgs/nixpkgs-unstable;
    flake-utils.url = github:numtide/flake-utils;
    language-c = { url = github:kalhauge/language-c; flake = false; };
  };
  outputs =
    { self
    , nixpkgs
    , flake-utils
    , ...
    }@inputs:
    let
      packages = final: p: {
        "rtree" = p.callCabal2nixWithOptions "rtree" "${self}" "" { };
        "language-c" =
          final.haskell.lib.overrideCabal
            (p.callCabal2nixWithOptions "language-c" inputs.language-c "" { })
            {
              doCheck = false;
            };
      };
      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 = [ overlays ];
        }).haskellPackages;
      in
      rec {
        packages = {
          default = hpkgs.rtree;
          rtree = hpkgs.rtree;
        };
        devShells =
          let
            buildInputs = with hpkgs; [
              cabal-install
              ghcid
              haskell-language-server
              hpack
              fourmolu
            ];
            withHoogle = true;
          in
          {
            default = hpkgs.shellFor
              {
                name = "rtree-shell";
                packages = p:
                  [ p.rtree ];
                inherit buildInputs withHoogle;
              };
          };
      });
}