anchor.diff:         catAttrs "a" [{a = 1;} {b = 0;} {a = 2;}]
          => [1 2]
     */
  -  catAttrs = attr: l: fold (s: l: if hasAttr attr s then [(builtins.getAttr attr s)] ++ l else l) [] l;
  +  catAttrs = attr: l: fold (s: l: if hasAttr attr s then [(getAttr attr s)] ++ l else l) [] l;
   
   
     /* Utility function that creates a {name, value} pair as expected by
  
positive.code:     in
        if attrPath == [] then e
        else if builtins ? hasAttr && hasAttr attr e
        then attrByPath (tail attrPath) default (builtins.getAttr attr e)
        else default;
  
    # keep compatibility for some time. will be removed soon (the name getAttr
    # should only be used for the builtins primop)
    getAttr = a : b : c : builtins.trace "depreceated usage of lib.getAttr!"
      (attrByPath a b c);
  
  
    getAttrFromPath = attrPath: set:
  
negative.code:        => {x = "x-foo"; y = "y-bar";}
    */
    mapAttrs = f: set:
      listToAttrs (map (attr: nameValuePair attr (f attr (getAttr attr set))) (attrNames set));
      
  
    /* Like `mapAttrs', except that it recursively applies itself to
  