summary refs log tree commit diff
path: root/lib/attrsets.nix
diff options
context:
space:
mode:
authorJacek Galowicz <jacek@galowicz.de>2021-01-25 16:59:46 +0100
committerJacek Galowicz <jacek@galowicz.de>2021-01-28 23:08:59 +0100
commit123045a57056b997165be4963cbf62120a967fec (patch)
treedf971067e1c59e11fba585a121f060a3a49bd93d /lib/attrsets.nix
parentd9353519d70454b53c6c302205272ccac81e1b7f (diff)
downloadnixpkgs-123045a57056b997165be4963cbf62120a967fec.tar
nixpkgs-123045a57056b997165be4963cbf62120a967fec.tar.gz
nixpkgs-123045a57056b997165be4963cbf62120a967fec.tar.bz2
nixpkgs-123045a57056b997165be4963cbf62120a967fec.tar.lz
nixpkgs-123045a57056b997165be4963cbf62120a967fec.tar.xz
nixpkgs-123045a57056b997165be4963cbf62120a967fec.tar.zst
nixpkgs-123045a57056b997165be4963cbf62120a967fec.zip
lib/attrsets: add cartesianProductOfSets function
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 d91d7a0cd47..0ce3aaeca45 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;
-
 }