Commit 7e07b3ec authored by adisbladis's avatar adisbladis
Browse files

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.
parent 627af21e
Loading
Loading
Loading
Loading
+10 −6
Original line number Diff line number Diff line
@@ -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`.