lib.attrsets.hasAttrByPath: Don't allocate one extra list per lookup recursion

Using `tail` in a recursive loop like this needlessly allocates.
This changes the loop to look up by list index instead.
This commit is contained in:
adisbladis 2023-11-27 01:41:01 +13:00
parent 627af21e87
commit 7e07b3ecd5

View File

@ -58,13 +58,17 @@ rec {
attrPath:
# The nested attribute set to check
e:
let attr = head attrPath;
let
lenAttrPath = length attrPath;
hasAttrByPath' = n: s: let
attr = elemAt attrPath n;
in (
if n == lenAttrPath then true
else if s ? ${attr} then hasAttrByPath' (n + 1) s.${attr}
else false
);
in
if attrPath == [] then true
else if e ? ${attr}
then hasAttrByPath (tail attrPath) e.${attr}
else false;
hasAttrByPath' 0 e;
/* Create a new attribute set with `value` set at the nested attribute location specified in `attrPath`.