anchor.diff:         }
   
        */
  -  recursiveUpdate = lhs: rhs:
  -    recursiveUpdateUntil (path: lhs: rhs:
  -      !(isAttrs lhs && isAttrs rhs)
  -    ) lhs rhs;
  +  recursiveUpdate = recursiveUpdateUntil (path: lhs: rhs: !(isAttrs lhs && isAttrs rhs));
   
     /* Returns true if the pattern is contained in the set. False otherwise.
   
  
positive.code:     let f = attrPath:
        zipAttrsWith (n: values:
          let here = attrPath ++ [n]; in
          if tail values == []
          || pred here (head (tail values)) (head values) then
            head values
          else
            f here values
  
negative.code:       value = f name (catAttrs name sets);
      }) names);
  
    /* Implementation note: Common names appear multiple times in the list of
       names, hopefully this does not affect the system because the maximal
       laziness avoid computing twice the same expression and listToAttrs does
       not care about duplicated attribute names.
  