summaryrefslogtreecommitdiffstats
path: root/lib/attrsets.nix
diff options
context:
space:
mode:
Diffstat (limited to 'lib/attrsets.nix')
-rw-r--r--lib/attrsets.nix19
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/attrsets.nix b/lib/attrsets.nix
index d91d7a0cd47e..0ce3aaeca452 100644
--- a/lib/attrsets.nix
+++ b/lib/attrsets.nix
@@ -183,6 +183,24 @@ rec {
else
[];
+ /* Return the cartesian product of attribute set value combinations.
+
+ Example:
+ cartesianProductOfSets { a = [ 1 2 ]; b = [ 10 20 ]; }
+ => [
+ { a = 1; b = 10; }
+ { a = 1; b = 20; }
+ { a = 2; b = 10; }
+ { a = 2; b = 20; }
+ ]
+ */
+ cartesianProductOfSets = attrsOfLists:
+ lib.foldl' (listOfAttrs: attrName:
+ concatMap (attrs:
+ map (listValue: attrs // { ${attrName} = listValue; }) attrsOfLists.${attrName}
+ ) listOfAttrs
+ ) [{}] (attrNames attrsOfLists);
+
/* Utility function that creates a {name, value} pair as expected by
builtins.listToAttrs.
@@ -493,5 +511,4 @@ rec {
zipWithNames = zipAttrsWithNames;
zip = builtins.trace
"lib.zip is deprecated, use lib.zipAttrsWith instead" zipAttrsWith;
-
}