%% ---
%%  Excerpted from "Programming Erlang",
%%  published by The Pragmatic Bookshelf.
%%  Copyrights apply to this code. It may not be used to create training material,
%%  courses, books, articles, and the like. Contact us if you are in doubt.
%%  We make no guarantees that this code is fit for any purpose.
%%  Visit http://www.pragmaticprogrammer.com/titles/jaerlang for more book information.
%%  
%%  日本語版の『プログラミングErlang』、およびサンプルコードについては、
%%   http://ssl.ohmsha.co.jp/cgi-bin/menu.cgi?ISBN=978-4-274-06714-3 を確認してください。
%% ---
-module(counter3).

-export([start/0, bump/1, read/1]).

start() -> spawn(fun() -> counter(0) end). %% <callout id="counter2.1"/>

bump(Pid) -> Pid ! bump.      %% <callout id="counter2.2"/> 

%% START:timeout

read(Pid) -> 
    Pid ! {self(), read}, 
    receive
	{Pid, N} ->       
	    N
    after
	1000 ->
	    noreply
    end.
    
%% END:timeout
counter(N) -> 
    receive      
	bump -> 
	    counter(N+1);
	{From, read} ->           %% <callout id="counter2.6"/>
	    From ! {self(), N},   %% <callout id="counter2.7"/>
	    counter(N);
	stop ->            
	    true
    end.

