diff options
author | Jacek Galowicz <jacek@galowicz.de> | 2021-01-25 16:59:46 +0100 |
---|---|---|
committer | Jacek Galowicz <jacek@galowicz.de> | 2021-01-28 23:08:59 +0100 |
commit | 123045a57056b997165be4963cbf62120a967fec (patch) | |
tree | df971067e1c59e11fba585a121f060a3a49bd93d /lib/attrsets.nix | |
parent | d9353519d70454b53c6c302205272ccac81e1b7f (diff) |
lib/attrsets: add cartesianProductOfSets function
Diffstat (limited to 'lib/attrsets.nix')
-rw-r--r-- | lib/attrsets.nix | 19 |
1 files changed, 18 insertions, 1 deletions
diff --git a/lib/attrsets.nix b/lib/attrsets.nix index d91d7a0cd47e6..0ce3aaeca452d 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; - } |