%%% $Id: prodcons.erlang,v 1.0 2002/10/21 16:58:00 dada Exp $
%%% http://dada.perl.it/shootout
%%%
%%% contributed by James Hague
-module(prodcons).
-export([main/0, main/1, producer/2, consumer/1]).
main() -> main(['1']).
main([Arg]) ->
N = list_to_integer(atom_to_list(Arg)),
spawn(prodcons, producer, [self(), N]),
receive
{Produced, Consumed} ->
io:fwrite("~w ~w~n", [Produced, Consumed]),
halt(0)
end.
producer(From, N) ->
Result = producer_loop(spawn(prodcons, consumer, [0]), 0, N),
From ! Result.
producer_loop(Consumer, Produced, 0) ->
Consumer ! {self(), stop},
receive
Consumed -> {Produced, Consumed}
end;
producer_loop(Consumer, Produced, N) ->
Consumer ! {self(), N},
receive
ok -> producer_loop(Consumer, Produced + 1, N - 1)
end.
consumer(Consumed) ->
receive
{From, stop} ->
From ! Consumed;
{From, I} ->
From ! ok,
consumer(Consumed + 1)
end.