diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 811225c542f1..ed2fa9770410 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -5,7 +5,6 @@ let inherit (builtins) head length; - inherit (lib.trivial) mergeAttrs; inherit (lib.strings) concatStringsSep concatMapStringsSep @@ -13,16 +12,18 @@ let sanitizeDerivationName ; inherit (lib.lists) - filter - foldr - foldl' + all + concatLists concatMap elemAt - all - partition - groupBy - take + filter foldl + foldl' + foldr + groupBy + partition + reverseList + take ; in @@ -370,7 +371,11 @@ rec { ::: */ - concatMapAttrs = f: v: foldl' mergeAttrs { } (attrValues (mapAttrs f v)); + concatMapAttrs = + f: v: + listToAttrs ( + concatLists (reverseList (mapAttrsToList (name: value: attrsToList (f name value)) v)) + ); /** Update or set specific paths of an attribute set. diff --git a/lib/tests/misc.nix b/lib/tests/misc.nix index 021a7eca25b8..6c254cae232b 100644 --- a/lib/tests/misc.nix +++ b/lib/tests/misc.nix @@ -2164,6 +2164,21 @@ runTests { }; }; + testConcatMapAttrsDuplicates = { + expr = + concatMapAttrs + (name: value: { + final = value; + }) + { + a = 1; + b = 2; + }; + expected = { + final = 2; + }; + }; + testFilterAttrs = { expr = filterAttrs (n: v: n != "a" && (v.hello or false) == true) { a.hello = true;