{ lib, inputs, secrets, dotfiles, hosts, hardwares, systems, isNixOS, isMacOS, isIso, isHardware, user, nixpkgs, home-manager, nix-darwin, ... }: let mkHost = { host, hardware, stateVersion, system, timezone, location, extraOverlays, extraModules }: isNixOS: isMacOS: isIso: isHardware: let pkgs = import nixpkgs { inherit system; config = { allowUnfree = true; allowBroken = true; allowUnsupportedSystem = true; }; overlays = [ inputs.nur.overlay (import ../packages) (import ../overlays) ] ++ extraOverlays; }; extraArgs = { inherit pkgs inputs isIso isHardware user secrets dotfiles timezone location hardware system stateVersion; hostname = host + "-" + hardware; }; extraSpecialModules = extraModules ++ lib.optional isHardware ../hardware/${hardware} ++ lib.optional isIso "${nixpkgs}/nixos/modules/installer/cd-dvd/installation-cd-minimal.nix"; in if isNixOS then nixpkgs.lib.nixosSystem { inherit system; specialArgs = extraArgs; modules = [ ./configuration.nix ./${host} home-manager.nixosModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.extraSpecialArgs = extraArgs; home-manager.users.${user} = { imports = [ ./home.nix ./${ host }/home.nix ]; }; } ] ++ extraSpecialModules; } else if isMacOS then nix-darwin.lib.darwinSystem { inherit system; specialArgs = extraArgs; modules = [ ./darwin.nix home-manager.darwinModules.home-manager { home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; home-manager.extraSpecialArgs = extraArgs; home-manager.users."manuel.palenzuela" = { imports = [ ./home-darwin.nix ]; }; } ]; } else home-manager.lib.homeManagerConfiguration { inherit pkgs; extraSpecialArgs = extraArgs; modules = [ ./home.nix ./${ host }/home.nix ]; }; hardwarePermutatedHosts = lib.concatMap (hardware: map (host: host // hardware) hosts) hardwares; systemsPermutatedHosts = lib.concatMap (system: map (host: host // system) hardwarePermutatedHosts) systems; permutatedHosts = systemsPermutatedHosts; in /* We have a list of sets. Map each element of the list applying the mkHost function to its elements and returning a set in the listToAttrs format builtins.listToAttrs on the result */ builtins.listToAttrs (map (mInput@{ host, hardware, system, ... }: { name = host + "-" + hardware + "-" + system; value = mkHost mInput isNixOS isMacOS isIso isHardware; }) permutatedHosts)