anchor.diff:    debugVal = if builtins ? trace then x: (builtins.trace x x) else x: x;
     debugXMLVal = if builtins ? trace then x: (builtins.trace (builtins.toXML x) x) else x: x;
   
  +  # this can help debug your code as well - designed to not produce thousands of lines
  +  traceWhatis = x : __trace (whatis x) x;
  +  whatis = x : 
  +      if (__isAttrs x) then
  +          if (x ? outPath) then "x is a derivation with name ${x.name}"
  +          else "x is an attr set with attributes ${builtins.toString (__attrNames x)}"
  +      else if (__isFunction x) then "x is a function"
  +      else if (__isList x) then "x is a list, first item is : ${whatis (__head x)}"
  +      else if (x == true || x == false) then builtins.toString x
  +      else "x is propably a string starting, starting characters: ${__substring 0 50 x}..";
  +
  +
     innerClosePropagation = ready: list: if list == [] then ready else
       if (head list) ? propagatedBuildInputs then 
         innerClosePropagation (ready ++ [(head list)]) 
  
positive.code:       innerClosePropagation (ready ++ [(head list)]) (tail list);
  
    closePropagation = list: (uniqList {inputList = (innerClosePropagation [] list);});
  
    # calls a function (f attr value ) for each record item. returns a list
    mapRecordFlatten = f : r : map (attr: f attr (builtins.getAttr attr r) ) (attrNames r);
  
negative.code:   # Map and concatenate the result.
    concatMap = f: list: concatLists (map f list);
  
    concatMapStrings = f: list: concatStrings (map f list);
    
  
    # Place an element between each element of a list, e.g.,
    # `intersperse "," ["a" "b" "c"]' returns ["a" "," "b" "," "c"].
  