%% Copyright (c) 2012, Magnus Klaar <klaar@ninenines.eu>
%%
%% Permission to use, copy, modify, and/or distribute this software for any
%% purpose with or without fee is hereby granted, provided that the above
%% copyright notice and this permission notice appear in all copies.
%%
%% THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
%% WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
%% MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
%% ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
%% WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
%% ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
%% OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

%% @doc Accessor function for goldrush event terms.
-module(gre).

-export([
    make/2,
    has/2,
    fetch/2,
    find/2,
    keys/1,
    pairs/1
]).

-type event() :: {list, [{atom(), term()}]}.
-export_type([event/0]).

%% @doc Construct an event term.
-spec make(term(), [list]) -> event().
make(Term, [Type]) ->
    {Type, Term}.


%% @doc Check if a field exists in an event.
-spec has(atom(), event()) -> boolean().
has(Key, {list, List}) ->
    lists:keymember(Key, 1, List).


%% @doc Get the value of a field in an event.
%% The field is expected to exist in the event.
-spec fetch(atom(), event()) -> term().
fetch(Key, {list, List}=Event) ->
    case lists:keyfind(Key, 1, List) of
        {_, Value} -> Value;
        false -> erlang:error(badarg, [Key, Event])
    end.


%% @doc Find the value of a field in an event.
%% This is equivalent to testing if a field exists using {@link has/2}
%% before accessing the value of the field using {@link fetch/2}.
-spec find(atom(), event()) -> {true, term()} | false.
find(Key, {list, List}) ->
    case lists:keyfind(Key, 1, List) of
        {_, Value} -> {true, Value};
        false -> false
    end.


%% @doc Get the names of all fields in an event.
-spec keys(event()) -> [atom()].
keys({list, List}) ->
    kv_keys_(List).

%% @private Get the names of all fields in a key-value list.
-spec kv_keys_([{atom(), term()}]) -> [atom()].
kv_keys_([{Key, _}|T]) ->
    [Key|kv_keys_(T)];
kv_keys_([]) ->
    [].

%% @doc Get the name and value of all fields in an event.
-spec pairs(event()) -> [{atom(), term()}].
pairs({list, List}) ->
    lists:sort(List).


-ifdef(TEST).
-include_lib("eunit/include/eunit.hrl").

gre_test_() ->
    [?_assert(gre:has(a, gre:make([{a,1}], [list]))),
     ?_assertNot(gre:has(b, gre:make([{a,1}], [list]))),
     ?_assertEqual(1, gre:fetch(a, gre:make([{a,1}], [list]))),
     ?_assertError(badarg, gre:fetch(a, gre:make([], [list]))),
     ?_assertEqual([], gre:keys(gre:make([], [list]))),
     ?_assertEqual([a], gre:keys(gre:make([{a,1}], [list]))),
     ?_assertEqual([a,b], gre:keys(gre:make([{a,1},{b,2}], [list]))),
     ?_assertEqual([{a,1},{b,2}], gre:pairs(gre:make([{b,2},{a,1}], [list])))
    ].

-endif.
