Unverified Commit 5690833b authored by Silvan Mosberger's avatar Silvan Mosberger Committed by GitHub
Browse files

lib: improve filterAttrs (#345547)

parents ede6eeb3 1de8e072
Loading
Loading
Loading
Loading
+2 −3
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@ let
  inherit (builtins) head length;
  inherit (lib.trivial) oldestSupportedReleaseIsAtLeast 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
+20 −0
Original line number Diff line number Diff line
@@ -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 = {