From 1c53d25f587f57dc45d3bd39964a039931756a57 Mon Sep 17 00:00:00 2001 From: Eman Resu <78693624+quatquatt@users.noreply.github.com> Date: Sun, 21 Jun 2026 18:01:06 -0400 Subject: [PATCH 1/2] lib.attrsets.concatMapAttrs: rewrite for efficiency --- lib/attrsets.nix | 23 ++++++++++++++--------- 1 file changed, 14 insertions(+), 9 deletions(-) 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. From f3e6fa555f71f2a4c87e51d457a1eeabcde459a8 Mon Sep 17 00:00:00 2001 From: Eman Resu <78693624+quatquatt@users.noreply.github.com> Date: Sun, 21 Jun 2026 18:04:34 -0400 Subject: [PATCH 2/2] lib.attrsets.concatMapAttrs: add test for handling duplicates --- lib/tests/misc.nix | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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;