Skip to content

Instantly share code, notes, and snippets.

@niamtokik
Created February 8, 2018 06:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save niamtokik/50a69e0eee82125dd62c1ad299c693e6 to your computer and use it in GitHub Desktop.
Save niamtokik/50a69e0eee82125dd62c1ad299c693e6 to your computer and use it in GitHub Desktop.
erlang process wrapper around common data-structure
-module(request).
-behaviour(gen_server).
%% API exports
-export([]).
-compile(export_all).
-record(state, { type, struct, name, options }).
start() ->
start([{type, ets}, {name, ?MODULE}]).
start(Args) ->
gen_server:start(?MODULE, Args, []).
init(Args) ->
Type = proplists:get_value(type, Args, ets),
Name = proplists:get_value(name, Args, ?MODULE),
Options = proplists:get_value(options, Args, []),
type(Type, Name, Options).
terminate(_,_) ->
ok.
code_change(_,_,_) ->
ok.
%%--------------------------------------------------------------------
%%
%%--------------------------------------------------------------------
% ets
handle_call({lookup, Pattern}, _From, State)
when State#state.type =:= ets ->
{reply, ets:lookup(State#state.struct, Pattern), State};
handle_call({match, Pattern}, _From, State)
when State#state.type =:= ets ->
{reply, ets:match(State#state.struct, Pattern), State};
handle_call({select, Pattern}, _From, State)
when State#state.type =:= ets ->
{reply, ets:select(State#state.struct, Pattern), State};
handle_call(_Request, _From, State) ->
{reply, ok, State}.
%%--------------------------------------------------------------------
%%
%%--------------------------------------------------------------------
% dict
handle_cast({add, Data}, State)
when State#state.type =:= dict ->
{noreply, State#state{ struct = dict:append(Data, State#state.struct) }};
handle_cast({delete, Data}, State)
when State#state.type =:= dict ->
{noreply, State#state{ struct = dict:erase(Data, State#state.struct) }};
% ets
handle_cast({add, Data}, State)
when State#state.type =:= ets ->
ets:insert(State#state.struct, Data),
{noreply, State};
handle_cast({delete, Data}, State)
when State#state.type =:= ets ->
ets:delete(State#state.struct, Data),
{noreply, State};
handle_cast(Request, State) ->
io:format("got: ~p~n", [Request]),
{noreply, State}.
%%--------------------------------------------------------------------
%%
%%--------------------------------------------------------------------
handle_info(Request, State) ->
io:format("got: ~p~n", [Request]),
{noreply, State}.
%%--------------------------------------------------------------------
%%
%%--------------------------------------------------------------------
type(ets, Name, Options) ->
{ok, #state{ type = ets,
name = Name,
struct = ets:new(Name, Options),
options = Options }
};
type(dict, Name, Options) ->
{ok, #state{ type = dict,
name = Name,
struct = dict:new(),
options = Options }
};
type(gb_sets, Name, Options) ->
{ok, #state{ type = gb_sets,
name = Name,
struct = gb_sets:new(),
options = Options }
};
typ(gb_trees, Name, Options) ->
{ok, #state{ type = gb_trees,
name = Name,
struct = gb_sets:new(),
options = Options }
}.
%%--------------------------------------------------------------------
%%
%%--------------------------------------------------------------------
padd(Data, State) ->
ok.
pdelete(Data, State) ->
ok.
pmatch(Data, State) ->
ok.
pselect(Data, State) ->
ok.
pmap(Data, State)->
ok.
pfold(Data, State) ->
ok.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment