anchor.diff:  
   %% @doc Equivalent to parse_config(Terms, Spec, #{})
   -spec parse_config(map()|list(), syntax()) ->
  -    {ok, [{atom(), term()}], [{atom(), term()}]} | 
  -    {ok, map(), map()} |
  -    {error, term()}.
  +    {ok, [{atom(), term()}], [{binary(), term()}]} | 
  +    {ok, #{atom()=>term()}, #{binary()=>term()}} |
  +    {error, Error}
  +    when Error :: 
  +        {syntax_error, binary()} | 
  +        {invalid_spec, syntax_opt()} |
  +        term().
   
   parse_config(Terms, Spec) ->
       parse_config(Terms, Spec, #{}).
  
positive.code:     {integer, [integer()]} | {record, atom()} |
      string | binary | lower | upper |
      ip | host | host6 | {function, pos_integer()} |
      unquote | path | uris | tokens | map() | list() |
      fun((atom(), term(), [{atom(), term()}]) -> 
              ok | {ok, term()} | {ok, term(), term()} |
              {new_ok, [{atom(), term()}]} | error | {error, term()}).
  
  -type syntax_opt() ::
      syntax_subopt() | {list|slist|ulist, syntax_subopt()} | 
  
negative.code: parse_config([], _Syntax, _) ->
      {ok, [], []};
  
  parse_config(Terms, Syntax, Opts) when is_list(Terms), is_map(Opts) ->
      try
          parse_config(Terms, [], [], Syntax, Opts)
      catch
          throw:Throw ->
              {error, Throw}
      end;
  
  parse_config(Terms, Syntax, Opts) when is_map(Terms), is_map(Opts) ->
      case maps:size(Terms) of
          0 -> parse_config([], Syntax, Opts);
          _ -> parse_config(maps:to_list(Terms), Syntax, Opts)
  