aboutsummaryrefslogtreecommitdiff
path: root/learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl
diff options
context:
space:
mode:
Diffstat (limited to 'learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl')
-rw-r--r--learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl35
1 files changed, 35 insertions, 0 deletions
diff --git a/learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl b/learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl
new file mode 100644
index 0000000..c42fd4d
--- /dev/null
+++ b/learn-you-some-erlang/erlcount-1.0/src/erlcount_counter.erl
@@ -0,0 +1,35 @@
+-module(erlcount_counter).
+-behaviour(gen_server).
+-export([start_link/4]).
+-export([init/1, handle_call/3, handle_cast/2, handle_info/2,
+ terminate/2, code_change/3]).
+
+-record(state, {dispatcher, ref, file, re}).
+
+start_link(DispatcherPid, Ref, FileName, Regex) ->
+ gen_server:start_link(?MODULE, [DispatcherPid, Ref, FileName, Regex], []).
+
+init([DispatcherPid, Ref, FileName, Regex]) ->
+ self() ! start,
+ {ok, #state{dispatcher=DispatcherPid,
+ ref = Ref,
+ file = FileName,
+ re = Regex}}.
+
+handle_call(_Msg, _From, State) ->
+ {noreply, State}.
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
+
+handle_info(start, S = #state{re=Re, ref=Ref}) ->
+ {ok, Bin} = file:read_file(S#state.file),
+ Count = erlcount_lib:regex_count(Re, Bin),
+ erlcount_dispatch:complete(S#state.dispatcher, Re, Ref, Count),
+ {stop, normal, S}.
+
+terminate(_Reason, _State) ->
+ ok.
+
+code_change(_OldVsn, State, _Extra) ->
+ {ok, State}.