-define(CHAR_ALIVE, 111). % "o"
-define(CHAR_BAR, 45). % "-"
--define(INTERVAL, 100).
+-define(GEN_INTERVAL, 100).
-record(state, {x :: non_neg_integer()
end
),
- {NewTime, NewBoard} = timer:tc(fun() -> next_generation(X, Y, Board) end),
+ {NewTime, NewBoard} = timer:tc(
+ fun() ->
+ next_generation(X, Y, Board)
+ end
+ ),
+
NewState = State#state{board = NewBoard
,gen_count = GenCount + 1
,gen_duration = NewTime
,print_time = PrintTime
},
- timer:sleep(?INTERVAL),
+ NewTimeMil = NewTime / 1000,
+ NextGenDelay = round(?GEN_INTERVAL - NewTimeMil),
+ timer:sleep(NextGenDelay),
+
life_loop(NewState).
do_print_board(Board) ->
+ % It seems that just doing a fold should be faster than map + to_list
+ % combo, but, after measuring several times, map + to_list has been
+ % consistently (nearly twice) faster than either foldl or foldr.
RowStrings = array:to_list(
array:map(
fun(_, Row) ->