anchor.diff:        ''
         else "${name} => ${exprToConfig value}";
   
  -  repeatedAttrsToConfig = names: values:
  -      concatStringsSep "\n" (zipListsWith valueToConfig names values);
  +  repeatedAttrsToConfig = values:
  +      concatStringsSep "\n" (map valueToConfig values);
   
     attrsToConfig = attrs:
       let
  -      attrToConfig = name: valueToConfig name (getAttr name attrs);
  +      attrToConfig = name: valueToConfig {
  +        inherit name;
  +        value = (getAttr name attrs);
  +      };
       in
         concatStringsSep "\n" (map attrToConfig (attrNames attrs));
   
  
positive.code:       if isFloat expr then expr.value else
        if isList expr then listToConfig expr else
        if isHash expr then hashToConfig expr.value else
        if isRepeatedAttrs expr then repeatedAttrsToConfig expr.names expr.values
        else attrsToConfig expr;
  
    mergeConfigs = configs:
  
negative.code:           and names are strings that can be repeated. name-value pairs with no
            repeats are represented by attr sets. name-value pairs with repeats
            are represented by an attrset with attr "__type" = "repeated" and
            attr "values" as a list of {name; value;} attrsets.
            bools, strings, ints, and arrays are mapped directly. Floats are
            represented as an attrset with attr "__type" = "float" and attr value
            set to the string representation of the float. Hashes are represented
  