%% @author Sachin Puri
-module(cqueue).
-behaviour(gen_server).
-compile(export_all).
%% ====================================================================
%% API functions
%% ====================================================================
start()->
gen_server:start({local, cqueue}, ?MODULE, [], []).
add(Data)->
gen_server:call(?MODULE, {add, Data}).
remove()->
gen_server:call(?MODULE, {remove}).
search(Data)->
gen_server:call(?MODULE, {search, Data}).
ls()->
gen_server:call(?MODULE, {ls}).
stop()->
gen_server:cast(?MODULE, stop).
clear()->
gen_server:call(?MODULE, clear).
%% ====================================================================
%% Internal functions
%% ====================================================================
init(_Args)->
io:format("Queue server started~n"),
{ok, []}.
handle_call({add, Data},_From, State)->
NewState = add(State, Data),
{reply, NewState, NewState};
handle_call({remove},_From, [H|T])->
NewState = T,
{reply, H, NewState};
handle_call({remove},_From, [])->
{reply, [], []};
handle_call({ls},_From, State)->
{reply, State, State};
handle_call({search, Data},_From, State)->
Result = search(Data, State, 1),
{reply, Result, State};
handle_call(clear,_From, _State)->
{reply, [], []}.
handle_cast(stop, State) ->
{stop, normal, State};
handle_cast(_Request, State) ->
{noreply, State}.
handle_info(_Info, State) ->
{noreply, State}.
terminate(_Reason, _State) ->
io:format("cqueue terminating.~n"),
ok.
code_change(_OldVsn, State, _Extra) ->
{ok, State}.
add([H|T], Data)->
[H|add(T, Data)];
add([], Data)->
[Data].
search(Data, [Data|_], Index)->
Index;
search(Data, [_H|T], Index)->
search(Data, T, Index+1);
search(_Data, [], _Db)->
0.