aboutsummaryrefslogtreecommitdiff
path: root/eco_pool.erl
blob: 63fbc3d049d06637e1332aed5a48e1391205a3e0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
-module(eco_pool).
-export([start_pool/1, start_random_pool/2]).

start_pool(Data) ->
	pool_loop(Data).

start_random_pool(Size, Max) ->
	random:seed(now()),
	Data = [random:uniform(Max) || _ <- lists:seq(1, Size)],
	pool_loop(Data).

pool_loop(PoolData) ->
	receive
		{From, stop} ->
			From ! {ok, stopped},
			{ok, stopped};
		{From, drain} ->
			From ! {ok, drained},
			pool_loop([]);
		{From, set, Data} ->
			From ! {ok, set, Data},
			pool_loop(Data);
		{From, put, Data} ->
			From ! {ok, put, Data},
			pool_loop(PoolData ++ Data);
		{From, get, Data} ->
			New = PoolData -- Data,
			Test = PoolData -- New,
			if
				Test =:= Data ->
					From ! {ok, get, Data},
					pool_loop(New);
				true ->
					From ! {error, get, Data},
					pool_loop(PoolData)
			end;
		{From, look} ->
			From ! {ok, look, PoolData},
			pool_loop(PoolData);
		Msg ->
			{error, invalid_message, Msg}
	end.