-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathkitchen.erl
77 lines (70 loc) · 1.43 KB
/
kitchen.erl
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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
-module(kitchen).
-compile(export_all).
%% return only not found, this function is very poor
fridge1() ->
receive
{From, {store, _Food}} ->
From ! {self(), ok},
fridge1();
{From, {take, _Food}} ->
From ! {self(), not_found},
fridge1();
terminate ->
ok
end.
%% more versatile and recursive function
%% server
start2(FoodList) ->
spawn(kitchen, fridge2, [FoodList]).
fridge2(FoodList) ->
receive
%% match first receive
{From, {store, Food}} ->
%% first answer
From ! {self(), {ok, Food}},
fridge2([Food|FoodList]);
{From, {list_all, ok}} ->
From ! {self(), {ok, FoodList}},
fridge2(FoodList);
%% match other receive
{From, {take, Food}} ->
%% conditional answer
case lists:member(Food, FoodList) of
true ->
From ! {self(), {ok, Food}},
fridge2(lists:delete(Food, FoodList));
false ->
From ! {self(), not_found},
fridge2(FoodList)
end;
terminate ->
ok
end.
%%% clients
%% store a food
store(Pid, Food) ->
Pid ! {self(), {store, Food}},
receive
{Pid, Msg} ->
Msg
after 3000 ->
timeout
end.
%% take a food
take(Pid, Food) ->
Pid ! {self(), {take, Food}},
receive
{Pid, Msg} ->
Msg
after 30000 ->
timeout
end.
%% list all food
list_products(Pid) ->
Pid ! {self(), {list_all, ok}},
receive
{Pid, Msg} ->
Msg
after 3000 ->
timeout
end.