Unverified Commit bbb4adee authored by adisbladis's avatar adisbladis Committed by GitHub
Browse files

Merge pull request #270133 from adisbladis/lib-attrbypath-allocs

lib.(has|)attrByPath: Don't needlessly allocate lists in loop
parents 8cfef698 544a1d37
Loading
Loading
Loading
Loading
+25 −11
Original line number Diff line number Diff line
@@ -34,12 +34,20 @@ rec {
    default:
    # The nested attribute set to select values from
    set:
    let attr = head attrPath;
    let
      lenAttrPath = length attrPath;
      attrByPath' = n: s: (
        if n == lenAttrPath then s
        else (
          let
            attr = elemAt attrPath n;
          in
      if attrPath == [] then set
      else if set ? ${attr}
      then attrByPath (tail attrPath) default set.${attr}
      else default;
          if s ? ${attr} then attrByPath' (n + 1) s.${attr}
          else default
        )
      );
    in
      attrByPath' 0 set;

  /* Return if an attribute from nested attribute set exists.

@@ -58,13 +66,19 @@ rec {
    attrPath:
    # The nested attribute set to check
    e:
    let attr = head attrPath;
    let
      lenAttrPath = length attrPath;
      hasAttrByPath' = n: s: (
        n == lenAttrPath || (
          let
            attr = elemAt attrPath n;
          in
      if attrPath == [] then true
      else if e ? ${attr}
      then hasAttrByPath (tail attrPath) e.${attr}
      else false;

          if s ? ${attr} then hasAttrByPath' (n + 1) s.${attr}
          else false
        )
      );
    in
      hasAttrByPath' 0 e;

  /* Create a new attribute set with `value` set at the nested attribute location specified in `attrPath`.