open Core.Std
+module Terminal : sig
+ type color = [ `green
+ | `red
+ ]
+
+ val string_with_color : string -> color -> string
+
+ val clear : unit -> unit
+
+ val reset : unit -> unit
+end = struct
+ type color = [ `green
+ | `red
+ ]
+
+ let ansi_code_clear = "\027[2J" (* Clear screen *)
+ let ansi_code_reset = "\027[1;1H" (* Reset cursor position *)
+
+ let string_of_color = function
+ | `green -> "\027[0;32m"
+ | `red -> "\027[1;31m"
+
+ let string_with_color s c =
+ sprintf "%s%s\027[0m" (string_of_color c) s
+
+ let clear () =
+ print_string ansi_code_clear
+
+ let reset () =
+ print_string ansi_code_reset
+end
+
+
module type MATRIX = sig
module Point : sig
type t = {r : int; k : int}
end
-module PhenoType = struct
- type t = string
+module PhenoType : sig
+ type t
+
+ val create : char -> Terminal.color option -> t
+
+ val to_string : t -> string
+end = struct
+ type t = { color : Terminal.color option
+ ; character : char
+ }
+
+ let create character color =
+ {color; character}
+
+ let to_string = function
+ | {color=None; character} ->
+ String.of_char character
+ | {color=Some c; character} ->
+ Terminal.string_with_color (String.of_char character) c
end
string_of_state
let pheno_of_state : (state -> PhenoType.t) = function
- | D -> " "
- | A -> "o"
+ | D -> PhenoType.create ' ' None
+ | A -> PhenoType.create 'o' None
let int_of_msg msg =
msg |> state_of_string |> int_of_state
; data = Rule.create ()
}
in
+ Terminal.clear ();
{ grid = Matrix.map ~f:init (Matrix.create ~rs ~ks ())
; interval = Time.Span.of_float interval
; bar = String.make ks '-'
}
let cell_to_string cell =
- cell.data.Cell.pheno
+ PhenoType.to_string cell.data.Cell.pheno
let print t =
+ Terminal.reset ();
print_endline t.bar;
Matrix.print t.grid ~to_string:cell_to_string;
print_endline t.bar