{
  inputs = {
    nixpkgs.url = github:NixOS/nixpkgs/nixos-unstable;
    quasar.url = github:queezle42/quasar;
    quasar.inputs.nixpkgs.follows = "nixpkgs";
  };

  outputs = { self, nixpkgs, quasar }:
  with nixpkgs.lib;
  let
    systems = platforms.unix;
    forAllSystems = genAttrs systems;
    getHaskellPackages = pkgs: pattern: pipe pkgs.haskell.packages [
      attrNames
      (filter (x: !isNull (strings.match pattern x)))
      (sort (x: y: x>y))
      (map (x: pkgs.haskell.packages.${x}))
      head
    ];
  in {
    packages = forAllSystems (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [
            self.overlays.default
            quasar.overlays.default
          ];
        };
        haskellPackages = getHaskellPackages pkgs "ghc94.";
        results = {
          qbar = haskellPackages.qbar;
        };
      in results // {
        default = pkgs.linkFarm "qbar-all" (results // mapAttrs' (k: v: nameValuePair "${k}-doc" (v.doc or pkgs.emptyDirectory)) results);
      }
    );

    apps = forAllSystems (system: {
      default = {
        type = "app";
        program = "${self.packages.${system}.qbar}/bin/qbar";
      };
    });

    overlays.default = final: prev: {
      haskell = prev.haskell // {
        packageOverrides = hfinal: hprev: prev.haskell.packageOverrides hfinal hprev // {
          qbar = hfinal.generateOptparseApplicativeCompletions ["qbar"]
            (hfinal.callCabal2nix "qbar" ./qbar {});
        };
      };
    };

    devShells = forAllSystems (system:
      let
        pkgs = import nixpkgs {
          inherit system;
          overlays = [
            self.overlays.default
            quasar.overlays.default
          ];
        };
        haskellPackages = getHaskellPackages pkgs "ghc94.";
      in rec {
        default = haskellPackages.shellFor {
          packages = hpkgs: [
            hpkgs.qbar
          ];
          nativeBuildInputs = [
            haskellPackages.haskell-language-server
            pkgs.cabal-install
            pkgs.hlint

            # in addition, for ghcid-wrapper
            pkgs.entr
            pkgs.ghcid
            pkgs.zsh
          ];
        };
      }
    );
  };
}