From 1ad7812c4ac038b653dd57b887c7c07d02bf1bec Mon Sep 17 00:00:00 2001 From: Silvan Mosberger Date: Thu, 2 Dec 2021 19:34:08 +0100 Subject: lib.lists: Use builtins.groupBy for lib.groupBy builtins.groupBy is much more performant. It was introduced in https://github.com/NixOS/nix/pull/5715 --- lib/lists.nix | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) (limited to 'lib/lists.nix') diff --git a/lib/lists.nix b/lib/lists.nix index 1dbff7668d7..a030280c8dc 100644 --- a/lib/lists.nix +++ b/lib/lists.nix @@ -4,6 +4,7 @@ let inherit (lib.strings) toInt; inherit (lib.trivial) compare min; + inherit (lib.attrsets) mapAttrs; in rec { @@ -340,15 +341,15 @@ rec { groupBy' builtins.add 0 (x: boolToString (x > 2)) [ 5 1 2 3 4 ] => { true = 12; false = 3; } */ - groupBy' = op: nul: pred: lst: - foldl' (r: e: - let - key = pred e; - in - r // { ${key} = op (r.${key} or nul) e; } - ) {} lst; + groupBy' = op: nul: pred: lst: mapAttrs (name: foldl op nul) (groupBy pred lst); - groupBy = groupBy' (sum: e: sum ++ [e]) []; + groupBy = builtins.groupBy or ( + pred: foldl' (r: e: + let + key = pred e; + in + r // { ${key} = (r.${key} or []) ++ [e]; } + ) {}); /* Merges two lists of the same size together. If the sizes aren't the same the merging stops at the shortest. How both lists are merged is defined -- cgit 1.4.1