{ description = "The Sieve of Eratosthenes implemented in many different languages"; inputs = { nixpkgs.url = "github:NixOS/nixpkgs"; flake-utils.url = "github:numtide/flake-utils"; }; outputs = { self, nixpkgs, flake-utils, ... }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; inherit (pkgs) lib; # Check if project has a shell.nix hasShell = dir: (builtins.readDir ./${dir}) ? "shell.nix"; # Get all project directories currentDir = builtins.readDir ./.; dirs = lib.filterAttrs (_: v: v == "directory") currentDir; in lib.concatMapAttrs (dir: _: { packages.${dir} = pkgs.callPackage ./${dir} {}; } // lib.optionalAttrs (hasShell dir) { devShells.${dir} = pkgs.callPackage ./${dir}/shell.nix {}; }) dirs ); }