anchor.diff:    innerModifySumArgs = f: x: a: b: if b == null then (f a b) // x else 
   	innerModifySumArgs f x (a // b);
     modifySumArgs = f: x: innerModifySumArgs f x {};
  +
  +  addLocation = if builtins ? addLocation then builtins.addLocation else msg: val: val;
   
     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;
  
positive.code:     (x: if builtins ? isString then builtins.isString x else x + "")
      concatStrings;
  
    # Merge sets of options and bindings.
    # noOption: function to call if no option is declared.
    mergeOptionSets = noOption: path: opts:
      if all __isAttrs opts then
        zip (attr: opts:
          let
            name = if path == "" then attr else path + "." + attr;
            test = partition isOption opts;
            opt = ({ merge = mergeDefaultOption; apply = id; } // head test.right);
          in
            if test.right == [] then mergeOptionSets noOption name (map delayIf test.wrong)
            else if tail test.right != [] then throw "Multiple options for '${name}'."
            else if test.wrong == [] then opt.apply opt.default
            else opt.apply (opt.merge name (map evalIf test.wrong))
        ) opts
     else noOption path opts;
  
    # Keep all option declarations and add an attribute "name" inside
    # each option which contains the path that has to be followed to
    # access it.
    filterOptionSets = path: opts:
      if all __isAttrs opts then
        zip (attr: opts:
          let
            name = if path == "" then attr else path + "." + attr;
            test = partition isOption opts;
          in
            if test.right == [] then filterOptionSets name (map delayIf test.wrong)
            else if tail test.right != [] then  throw "Multiple options for '${name}'."
            else { inherit name; } // (head test.right)
        ) opts
      else {};
  
    # Evaluate a list of option sets that would be merged with the
    # function "merge" which expects two arguments.  The attribute named
  
negative.code:       # call configuration "files" with one of the existing convention.
        optionSet = config: configFun:
          if __isFunction configFun then
            let result = configFun { inherit pkgs config merge; }; in
          # {pkgs, config, merge, ...}: {..}
            if builtins.isAttrs result then result
          # pkgs: config: {..}
            else builtins.trace "obsolete:" (configFun {} {})
          # {..}
          else configFun;
  
  