lib.lists: undeprecate crossLists

mapCartesianProduct's output's order relies on the iteration order of the input attrset
encouraging picking non-meaningful names or arbitrary prefixed underscores if your usecase
requires a specific order.

See this thread for examples of clunkiness required to achieve a specific ordering.
https://discourse.nixos.org/t/lib-crosslists-is-deprecated-use-lib-cartesianproductofsets-instead/41824/10
This commit is contained in:
Luna Nova
2025-03-26 18:05:55 -07:00
parent 73d0441dfe
commit d1de5d4748

View File

@@ -1814,7 +1814,7 @@ rec {
=> [ "13" "14" "23" "24" ] => [ "13" "14" "23" "24" ]
``` ```
The following function call is equivalent to the one deprecated above: If you have an attrset already, consider mapCartesianProduct:
```nix ```nix
mapCartesianProduct (x: "${toString x.a}${toString x.b}") { a = [1 2]; b = [3 4]; } mapCartesianProduct (x: "${toString x.a}${toString x.b}") { a = [1 2]; b = [3 4]; }
@@ -1822,19 +1822,7 @@ rec {
``` ```
::: :::
*/ */
crossLists = warn '' crossLists = f: foldl (fs: args: concatMap (f: map f args) fs) [ f ];
lib.crossLists is deprecated, use lib.mapCartesianProduct instead.
For example, the following function call:
nix-repl> lib.crossLists (x: y: x+y) [[1 2] [3 4]]
[ 4 5 5 6 ]
Can now be replaced by the following one:
nix-repl> lib.mapCartesianProduct ({x,y}: x+y) { x = [1 2]; y = [3 4]; }
[ 4 5 5 6 ]
'' (f: foldl (fs: args: concatMap (f: map f args) fs) [ f ]);
/** /**
Remove duplicate elements from the `list`. O(n^2) complexity. Remove duplicate elements from the `list`. O(n^2) complexity.