X-Git-Url: https://git.xandkar.net/?a=blobdiff_plain;f=polymorphism%2F001%2Fsrc%2Fpolymorphism.ml;h=5d6fbabb22378df3c7158794a3389dc8d23441b7;hb=56a56c38cbc5eb66950c1f473729b17bf956cac1;hp=8d85a0eda861b42ddb5db2f858cc4ea9961bb39d;hpb=31d923734f612795952158d003dc9e89fa5f17c7;p=cellular-automata.git diff --git a/polymorphism/001/src/polymorphism.ml b/polymorphism/001/src/polymorphism.ml index 8d85a0e..5d6fbab 100644 --- a/polymorphism/001/src/polymorphism.ml +++ b/polymorphism/001/src/polymorphism.ml @@ -209,9 +209,9 @@ struct sig type t = D | A - val of_int : int -> t + val random : unit -> t - val to_int : t -> int + val is_alive : t -> bool val to_cell : t -> Cell.t @@ -222,14 +222,15 @@ struct struct type t = D | A - let of_int = function + let random () = + match Random.int 2 with | 0 -> D | 1 -> A | _ -> assert false - let to_int = function - | D -> 0 - | A -> 1 + let is_alive = function + | D -> false + | A -> true let to_pheno = function | D -> PhenoType.create ' ' None @@ -260,12 +261,13 @@ struct | D -> D end - let create () = - Random.int 2 |> State.of_int |> State.to_cell + let create = + State.random |- State.to_cell - let count_of_live neighbors = - neighbors |> List.map ~f:(State.of_cell_state |- State.to_int) - |> List.fold_left ~init:0 ~f:(+) + let count_of_live = + List.map ~f:State.of_cell_state + |- List.filter ~f:State.is_alive + |- List.length let transition ~self ~neighbors = self |> State.of_cell_state @@ -282,9 +284,7 @@ struct val is_burning : t -> bool - val of_int : int -> t - - val to_int : t -> int + val random : unit -> t val to_cell : t -> Cell.t @@ -300,17 +300,13 @@ struct | T -> false | B -> true - let of_int = function + let random () = + match Random.int 3 with | 0 -> E | 1 -> T | 2 -> B | _ -> assert false - let to_int = function - | E -> 0 - | T -> 1 - | B -> 2 - let to_pheno = function | E -> PhenoType.create ' ' None | T -> PhenoType.create 'T' (Some `green) @@ -348,14 +344,13 @@ struct | B, _ -> E end - let create () = - Random.int 3 |> State.of_int |> State.to_cell + let create = + State.random |- State.to_cell - let count_of_burning neighbors = - neighbors |> List.map ~f:State.of_cell_state - |> List.filter ~f:State.is_burning - |> List.map ~f:State.to_int - |> List.fold_left ~init:0 ~f:(+) + let count_of_burning = + List.map ~f:State.of_cell_state + |- List.filter ~f:State.is_burning + |- List.length let transition ~self ~neighbors = self |> State.of_cell_state