anchor.diff:      has_key(Key,?FROM_JSON(DataObject)).
   
   
  -%% @doc Unordered list of keys used by data object
  +%% @doc Erlang term ordered list of keys used by data object
   -spec keys(data_object()) -> list().
   keys(DataObject) when is_list(DataObject) -> 
  -    proplists:get_keys(DataObject);
  +    lists:sort(proplists:get_keys(DataObject));
   keys(DataObject) when is_map(DataObject) -> 
  -    maps:keys(DataObject);
  +    lists:sort(maps:keys(DataObject));
   keys(DataObject) -> 
       keys(?FROM_JSON(DataObject)).
   
  
positive.code: 
  %% Type definitions
  %% ===================================================================
  -type data_object() :: list() | map() | binary().
  -type diff_object() :: list() | map() | binary().
  -type value() :: term().
  -type key() :: binary().
  
  %% ===================================================================
  %% Exported functions
  %% ===================================================================
  
  %% @doc Find function, returns {ok,Value} or error
  -spec find(key(),data_object()) -> {ok, value()} | error.
  find(Key,DataObject) when is_list(DataObject) ->
  
negative.code: -define(JSON_LIBS, [{jsx, 
                       fun(<<"{}">>) -> [];
                          (__JS) -> jsx:decode(__JS) end,
                       fun(__JS) when is_list(__JS) -> jsx:encode(__JS) end},
                          %(__JS) when is_map(__JS) -> jsx:encode(maps:to_list(__JS)) end},
                      {jiffy,
                       fun(<<"{}">>) -> [];
                          (__JS) -> {O} = jiffy:decode(__JS), O end,
                       fun(__JS) when is_list(__JS) -> jiffy:encode({__JS})}
                          %(__JS) when is_map(__JS) -> jiffy:encode(__JS) end}
                     ]).
  -endif.
  
  