diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 8bb4ef972fd8..f4b03e5b53aa 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -7,7 +7,7 @@ let inherit (builtins) head length; inherit (lib.trivial) isInOldestRelease mergeAttrs warn warnIf; inherit (lib.strings) concatStringsSep concatMapStringsSep escapeNixIdentifier sanitizeDerivationName; - inherit (lib.lists) foldr foldl' concatMap elemAt all partition groupBy take foldl; + inherit (lib.lists) filter foldr foldl' concatMap elemAt all partition groupBy take foldl; in rec { @@ -644,8 +644,7 @@ rec { filterAttrs = pred: set: - listToAttrs (concatMap (name: let v = set.${name}; in if pred name v then [(nameValuePair name v)] else []) (attrNames set)); - + removeAttrs set (filter (name: ! pred name set.${name}) (attrNames set)); /** Filter an attribute set recursively by removing all attributes for diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 116d86cdfb3f..72b3d630b8da 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -47,6 +47,7 @@ let evalModules extends filter + filterAttrs fix fold foldAttrs @@ -1102,6 +1103,25 @@ runTests { }; }; + testFilterAttrs = { + expr = filterAttrs (n: v: n != "a" && (v.hello or false) == true) { + a.hello = true; + b.hello = true; + c = { + hello = true; + world = false; + }; + d.hello = false; + }; + expected = { + b.hello = true; + c = { + hello = true; + world = false; + }; + }; + }; + # code from example testFoldlAttrs = { expr = {