X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=polymorphism%2F001%2Fsrc%2Fpolymorphism.ml;h=f94d5adebbf5bb242e62e6a1bd4a4650ac051e5e;hb=4b18b7df65b1fc0a1bd15b5f0ddfc82a338485b8;hp=c52df9338acb3fe610a43736212cc691502e784b;hpb=8526e3e1220a86ff1d6fee238123611f89a4f242;p=cellular-automata.git diff --git a/polymorphism/001/src/polymorphism.ml b/polymorphism/001/src/polymorphism.ml index c52df93..f94d5ad 100644 --- a/polymorphism/001/src/polymorphism.ml +++ b/polymorphism/001/src/polymorphism.ml @@ -1,6 +1,39 @@ 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} @@ -117,8 +150,25 @@ module State = struct 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 @@ -162,8 +212,8 @@ module Conway : RULE = struct 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 @@ -227,15 +277,17 @@ end = struct ; 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