anchor.diff:  compile_impl([], _, Result, _) ->
       Result;
   compile_impl([{n, Key} | T], Map, Result, Options) ->
  -    compile_impl(T, Map, [escape(to_binary(data_get(binary_to_list(Key), Map, <<>>, Options))) | Result], Options);
  +    compile_impl(T, Map, [escape(to_binary(data_get(convert_keytype(Key, Options), Map, <<>>))) | Result], Options);
   compile_impl([{'&', Key} | T], Map, Result, Options) ->
  -    compile_impl(T, Map, [to_binary(data_get(binary_to_list(Key), Map, <<>>, Options)) | Result], Options);
  +    compile_impl(T, Map, [to_binary(data_get(convert_keytype(Key, Options), Map, <<>>)) | Result], Options);
   compile_impl([{'#', Key, Tags, Source} | T], Map, Result, Options) ->
  -    Value = data_get(binary_to_list(Key), Map, undefined, Options),
  +    Value = data_get(convert_keytype(Key, Options), Map, undefined),
       case check_data_type(Value) of
           true                                        -> compile_impl(T, Map, compile_impl(Tags, Value, Result, Options), Options);
           _ when is_list(Value)                       -> compile_impl(T, Map, lists:foldl(fun(X, Acc) -> compile_impl(Tags, X, Acc, Options) end,
                                                                                           Result, Value), Options);
           _ when Value =:= false; Value =:= undefined -> compile_impl(T, Map, Result, Options);
  -        _ when is_function(Value, 2)                -> compile_impl(T, Map, [Value(Source, fun(Text) -> render(Text, Map) end) | Result], Options);
  +        _ when is_function(Value, 2)                -> compile_impl(T, Map, [Value(Source, fun(Text) -> render(Text, Map, Options) end) | Result], Options);
           _                                           -> compile_impl(T, Map, compile_impl(Tags, Map, Result, Options), Options)
       end;
   compile_impl([{'^', Key, Tags} | T], Map, Result, Options) ->
  -    Value = data_get(binary_to_list(Key), Map, undefined, Options),
  +    Value = data_get(convert_keytype(Key, Options), Map, undefined),
       case Value =:= undefined orelse Value =:= [] orelse Value =:= false of
           true  -> compile_impl(T, Map, compile_impl(Tags, Map, Result, Options), Options);
           false -> compile_impl(T, Map, Result, Options)
  
positive.code:         _         -> error(?FILE_ERROR, [Filename])
      end.
  
  %% @doc Embed the data in the template.
  -spec compile(template(), data()) -> binary().
  compile(T, Data) ->
      compile(T, Data, []).
  
  %% @doc Embed the data in the template.
  -spec compile(template(), data(), options()) -> binary().
  
negative.code: %% @see parse_binary/1
  %% @see parse_file/1
  
  -type data_key()   :: atom() | binary() | string().
  -type data_value() :: data() | iodata() | number() | atom() | fun((data(), function()) -> iodata()).
  -type assoc_data() :: [{atom(), data_value()}] | [{binary(), data_value()}] | [{string(), data_value()}].
  
  -type option()     :: {key_type, atom | binary | string}.
  %% - key_type: Specify the type of the key in {@link data/0}. Default value is `string'.
  -type options()    :: [option()].
  
  -ifdef(namespaced_types).
  -type maps_data() :: #{atom() => data_value()} | #{binary() => data_value()} | #{string() => data_value()}.
  -type data()      :: maps_data() | assoc_data().
  -else.
  -type data()      :: assoc_data().
  -endif.
  %% All key in assoc list or maps must be same type.
  %% @see render/2
  %% @see compile/2
  
  