{reply, ok, State}.
-handle_cast(_Msg, State) ->
- {noreply, State}.
-
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-handle_info(tick,
+handle_cast(tick,
#state{name=Name
,neighbors=Neighbors
,num_neighbors=NumNeighbors
}=State) ->
-
- ok = send_all(Neighbors, {request_state, Name}),
+ ok = cast_all(Neighbors, {request_state, Name}),
{noreply, State#state{replies_pending=NumNeighbors}};
-handle_info({request_state, Requester}, State) ->
- Requester ! {response_state, State#state.cell_state},
+handle_cast({request_state, Requester}, State) ->
+ ok = gen_server:cast(Requester, {response_state, State#state.cell_state}),
{noreply, State};
-handle_info({response_state, NeighborState},
+handle_cast({response_state, NeighborState},
#state{id=ID
,replies_pending=Pending
,cell_state=CellState
case NewPending of
0 ->
NewCellState = new_state(CellState, NewLiveNeighbors),
- ok = time:cast({tock, {ID, NewCellState}}),
+ ok = time:tock(ID, NewCellState),
{noreply, NewState#state{live_neighbors=0
,cell_state=NewCellState
- }};
+ }
+ };
_N ->
{noreply, NewState}
end;
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+handle_cast(_Msg, State) ->
+ {noreply, State}.
handle_info(_Msg, State) ->
%% Internal
%% ============================================================================
-send_all([], _) -> ok;
-send_all([PID | PIDs], Msg) ->
- PID ! Msg,
- send_all(PIDs, Msg).
+cast_all([], _) -> ok;
+cast_all([Server | Servers], Msg) ->
+ ok = gen_server:cast(Server, Msg),
+ cast_all(Servers, Msg).
new_state(1, LiveNeighbors) when LiveNeighbors < 2 -> 0;
%% API
-export([start_link/2
- ,cast/1
+ ,tock/2
]).
%% Callbacks
gen_server:start_link(ServerName, ?MODULE, Args, Opts).
-cast(Msg) ->
- gen_server:cast(?MODULE, Msg).
+tock(CellID, CellState) ->
+ gen_server:cast(?MODULE, {tock, {CellID, CellState}}).
%% ============================================================================
,state_pairs=[]
,replies_pending=0
},
- cast(next_tick),
+ schedule_next_tick(),
{ok, State}.
{reply, ok, State}.
-handle_cast(next_tick, #state{cells=Cells, num_cells=NumCells, state_pairs=[]}=State) ->
- ok = send_all(Cells, tick),
+handle_cast(next_tick,
+ #state{cells=Cells
+ ,num_cells=NumCells
+ ,state_pairs=[]
+ }=State) ->
+
+ ok = cast_all(Cells, tick),
{noreply, State#state{replies_pending=NumCells}};
handle_cast({tock, {ID, CellState}},
ok = do_print_state_chars(X, StateChars),
ok = do_print_bar(X),
ok = timer:sleep(?INTERVAL),
- cast(next_tick),
+ schedule_next_tick(),
{noreply, NewState#state{state_pairs=[], gen_count=NewGenCount}};
_N ->
%% Internal
%% ============================================================================
-send_all([], _) -> ok;
-send_all([PID | PIDs], Msg) ->
- PID ! Msg,
- send_all(PIDs, Msg).
+schedule_next_tick() ->
+ gen_server:cast(?MODULE, next_tick).
+
+
+cast_all([], _) -> ok;
+cast_all([Server | Servers], Msg) ->
+ ok = gen_server:cast(Server, Msg),
+ cast_all(Servers, Msg).
state_to_char(0) -> ?CHAR_DEAD;