From 3f4ce46a4702940cb7d1d12349c0407576225605 Mon Sep 17 00:00:00 2001 From: polykernel <81340136+polykernel@users.noreply.github.com> Date: Fri, 20 Aug 2021 12:24:39 -0400 Subject: [PATCH] lib: optimize setAttrByPath and cleaup imports - Remove inheritance of `lists.fold` as it isn't used anywhere. - Inherit `foldl'` for consistency as only `cartesianProductOfSets` explicitly reference lib. - Inline `foldr` to generate nested attrs instead of using `listToAttrs` and `tail`. --- lib/attrsets.nix | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 0b61819f6b4b..31fddc59e20e 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -5,7 +5,7 @@ let inherit (builtins) head tail length; inherit (lib.trivial) and; inherit (lib.strings) concatStringsSep sanitizeDerivationName; - inherit (lib.lists) fold foldr concatMap concatLists; + inherit (lib.lists) foldr foldl' concatMap concatLists elemAt; in rec { @@ -55,10 +55,13 @@ rec { => { a = { b = 3; }; } */ setAttrByPath = attrPath: value: - if attrPath == [] then value - else listToAttrs - [ { name = head attrPath; value = setAttrByPath (tail attrPath) value; } ]; - + let + len = length attrPath; + atDepth = n: + if n == len + then value + else { ${elemAt attrPath n} = atDepth (n + 1); }; + in atDepth 0; /* Like `attrByPath' without a default value. If it doesn't find the path it will throw. @@ -195,7 +198,7 @@ rec { ] */ cartesianProductOfSets = attrsOfLists: - lib.foldl' (listOfAttrs: attrName: + foldl' (listOfAttrs: attrName: concatMap (attrs: map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName} ) listOfAttrs