From 63ce7d3184bf841da8239d8a78e7e9c931022a5c Mon Sep 17 00:00:00 2001 From: polykernel <81340136+polykernel@users.noreply.github.com> Date: Mon, 27 Dec 2021 17:53:15 -0500 Subject: lib/attrset: miscellaneous optimizations - Eta reduce `mapAttrsRecursiveCond`, `foldAttrs`, `getAttrFromPath`. - Modify `matchAttrs` to use `elemAt` instead of `head (tail xs)` to access elements. - Modify `matchAttrs` to use `any id` instead of `foldr and true`. --- lib/attrsets.nix | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) (limited to 'lib/attrsets.nix') diff --git a/lib/attrsets.nix b/lib/attrsets.nix index 4e88601dbd3ef..9e47304959a18 100644 --- a/lib/attrsets.nix +++ b/lib/attrsets.nix @@ -3,9 +3,9 @@ let inherit (builtins) head tail length; - inherit (lib.trivial) and; + inherit (lib.trivial) id; inherit (lib.strings) concatStringsSep sanitizeDerivationName; - inherit (lib.lists) foldr foldl' concatMap concatLists elemAt; + inherit (lib.lists) foldr foldl' concatMap concatLists elemAt all; in rec { @@ -73,9 +73,9 @@ rec { getAttrFromPath ["z" "z"] x => error: cannot find attribute `z.z' */ - getAttrFromPath = attrPath: set: + getAttrFromPath = attrPath: let errorMsg = "cannot find attribute `" + concatStringsSep "." attrPath + "'"; - in attrByPath attrPath (abort errorMsg) set; + in attrByPath attrPath (abort errorMsg); /* Return the specified attributes from a set. @@ -154,12 +154,12 @@ rec { foldAttrs (n: a: [n] ++ a) [] [{ a = 2; } { a = 3; }] => { a = [ 2 3 ]; } */ - foldAttrs = op: nul: list_of_attrs: + foldAttrs = op: nul: foldr (n: a: foldr (name: o: o // { ${name} = op n.${name} (a.${name} or nul); } ) a (attrNames n) - ) {} list_of_attrs; + ) {}; /* Recursively collect sets that verify a given predicate named `pred' @@ -295,14 +295,14 @@ rec { */ mapAttrsRecursiveCond = cond: f: set: let - recurse = path: set: + recurse = path: let g = name: value: if isAttrs value && cond value then recurse (path ++ [name]) value else f (path ++ [name]) value; - in mapAttrs g set; + in mapAttrs g; in recurse [] set; @@ -455,8 +455,8 @@ rec { => true */ matchAttrs = pattern: attrs: assert isAttrs pattern; - foldr and true (attrValues (zipAttrsWithNames (attrNames pattern) (n: values: - let pat = head values; val = head (tail values); in + all id (attrValues (zipAttrsWithNames (attrNames pattern) (n: values: + let pat = head values; val = elemAt values 1; in if length values == 1 then false else if isAttrs pat then isAttrs val && matchAttrs pat val else pat == val -- cgit 1.4.1