anchor.diff:  %% Types
   %% ===================================================================
   
  --type syntax() :: #{key() => syntax_opt()}.
  +-type syntax() ::
  +    #{
  +        key() => syntax_opt(),
  +        '__defaults' => #{key() => term()}  ,       % Defaults for this level
  +        '__mandatory' => [key()],                   % Mandatory fields for this level
  +        '__unique_keys' => [key()],                 % Checks that keys are unique in a list
  +        '__allow_unknown' => boolean(),             % Allow unknown fields
  +        '__post_check' => post_check_fun()
  +    }.
  +
   
   -type syntax_opt() ::
       syntax_term() |
  
positive.code:     map |
      log_level |
      {mfa, module(), atom(), [term()]} |
      map() |                     % Allow for nested objects
      list() |                    % First matching option is used
      syntax_fun() |
      '__defaults' |              % Defaults for this level #{atom() => term()}
      '__mandatory' |             % Mandatory fields for this level [atom()]
      '__allow_unknown' |         % Allow unknown fields (boolean)
      '__post_check'.             % See post_check_fun()
  
  
  -type key() :: atom().
  -type val() :: term().
  
  
  
negative.code: 
  
  %% @private
  parse_opt_list(list, SyntaxOp, Key, [], Parse, Acc) ->
      check_unique_key(Key, lists:reverse(Acc), SyntaxOp, Parse);
  
  parse_opt_list(slist, SyntaxOp, Key, [], Parse, Acc) ->
      check_unique_key(Key, lists:sort(Acc), SyntaxOp, Parse);
  
  parse_opt_list(ulist, SyntaxOp, Key, [], Parse, Acc) ->
      check_unique_key(Key, lists:usort(Acc), SyntaxOp, Parse);
  
  parse_opt_list(ListType, SyntaxOp, Key, [Term | Rest], Parse, Acc) ->
      case parse_opt(SyntaxOp, Key, Term, Parse) of
  