{ inputs = { flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, ... }: let inherit (builtins) listToAttrs mapAttrs; allPackageNames = [ "d2" "d2plugin-tala" "d2full" "fawltydeps" ]; mkAllPackages = pkgs': let d2-unwrapped = pkgs'.callPackage ./pkgs/d2/d2-unwrapped.nix { }; d2plugin-tala = pkgs'.callPackage ./pkgs/d2/d2plugin-tala.nix { }; d2 = pkgs'.callPackage ./pkgs/d2 { inherit d2-unwrapped d2plugin-tala; }; fawltydeps = pkgs'.callPackage ./pkgs/fawltydeps { }; in { inherit d2 d2plugin-tala fawltydeps; d2-full = d2.override { withTala = true; }; }; mkApp = drv: flake-utils.lib.mkApp { inherit drv; }; mkOverlay = name: final: prev: final.filterAttrs (n: v: n == name) (mkAllPackages prev); in { overlays = (listToAttrs (map (name: { inherit name; value = mkOverlay name; }) allPackageNames ) ) // { all = final: prev: mkAllPackages prev; }; } // flake-utils.lib.eachDefaultSystem (system: let pkgs = import nixpkgs { inherit system; }; packages = mkAllPackages pkgs; in { check = packages; inherit packages; apps = mapAttrs (name: mkApp) packages; }); }