From d1de5d4748abc179161a40957514554e21525843 Mon Sep 17 00:00:00 2001 From: Luna Nova Date: Wed, 26 Mar 2025 18:05:55 -0700 Subject: [PATCH] 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 --- lib/lists.nix | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/lib/lists.nix b/lib/lists.nix index 3d324e545dd4..7da712c0bf4d 100644 --- a/lib/lists.nix +++ b/lib/lists.nix @@ -1814,7 +1814,7 @@ rec { => [ "13" "14" "23" "24" ] ``` - The following function call is equivalent to the one deprecated above: + If you have an attrset already, consider mapCartesianProduct: ```nix mapCartesianProduct (x: "${toString x.a}${toString x.b}") { a = [1 2]; b = [3 4]; } @@ -1822,19 +1822,7 @@ rec { ``` ::: */ - crossLists = warn '' - 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 ]); + crossLists = f: foldl (fs: args: concatMap (f: map f args) fs) [ f ]; /** Remove duplicate elements from the `list`. O(n^2) complexity.