{lib, pkgs, ...}: let rootDirs = builtins.readDir ./.; removeFiles = lib.attrsets.filterAttrs (n: v: v == "directory") rootDirs; programsToPatch = builtins.attrNames removeFiles; getPatches = name: builtins.map (value: ./${name}/${value}) (builtins.attrNames ( lib.attrsets.filterAttrs ( n: v: v == "regular" && lib.strings.hasSuffix ".patch" n ) (builtins.readDir ./${name}) )); bigOverlay = final: prev: lib.attrsets.mergeAttrsList ( lib.lists.forEach programsToPatch ( program: let unpatchedProgram = prev."${program}"; in { "${program}-patched" = unpatchedProgram.overrideAttrs { patches = unpatchedProgram.patches ++ getPatches program; }; } ) ); in { nixpkgs.overlays = [ ( final: prev: { kdePackages = prev.kdePackages.overrideScope bigOverlay; } ) ]; system.replaceDependencies.replacements = lib.lists.forEach programsToPatch ( package: { oldDependency = pkgs.kdePackages.${package}; newDependency = pkgs.kdePackages."${package}-patched"; } ); system.extraDependencies = lib.lists.forEach programsToPatch ( package: pkgs.kdePackages."${package}-patched" ); }