type 'a t
- val create : rs:int -> ks:int -> 'a -> 'a t
+ val make : rs:int -> ks:int -> 'a -> 'a t
val get_neighbors : 'a t -> Point.t -> 'a list
type 'a t = 'a array array
- let create ~rs ~ks x =
+ let make ~rs ~ks x =
Array.make_matrix ~dimx:rs ~dimy:ks x
let iter t ~f =
sig
type t
- val create : char -> Terminal.color option -> t
+ val make : char -> Terminal.color option -> t
val to_string : t -> string
end =
; character : char
}
- let create character color =
+ let make character color =
{color; character}
let to_string = function
module type RULE =
sig
- val create : unit -> Cell.t
+ val init : unit -> Cell.t
val transition : self:Cell.State.t
-> neighbors:Cell.State.t list
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
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
- | A -> PhenoType.create 'o' (Some `white)
+ | D -> PhenoType.make ' ' None
+ | A -> PhenoType.make 'o' (Some `white)
let of_cell_state = function
| Cell.State.Dead -> D
| D -> D
end
- let create () =
- Random.int 2 |> State.of_int |> State.to_cell
+ let init =
+ State.random |- State.to_cell
let count_of_live =
- List.map ~f:State.of_cell_state
- |- List.map ~f:State.to_int
- |- List.fold_left ~f:(+) ~init:0
+ List.map ~f:State.of_cell_state
+ |- List.filter ~f:State.is_alive
+ |- List.length
let transition ~self ~neighbors =
self |> State.of_cell_state
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
| 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)
- | B -> PhenoType.create '#' (Some `red)
+ | E -> PhenoType.make ' ' None
+ | T -> PhenoType.make 'T' (Some `green)
+ | B -> PhenoType.make '#' (Some `red)
let of_cell_state = function
| Cell.State.Dead -> E
| B, _ -> E
end
- let create () =
- Random.int 3 |> State.of_int |> State.to_cell
+ let init =
+ State.random |- State.to_cell
let count_of_burning =
- List.map ~f:State.of_cell_state
- |- List.filter ~f:State.is_burning
- |- List.map ~f:State.to_int
- |- List.fold_left ~f:(+) ~init:0
+ List.map ~f:State.of_cell_state
+ |- List.filter ~f:State.is_burning
+ |- List.length
let transition ~self ~neighbors =
self |> State.of_cell_state
sig
type t
- val create : rows:int
+ val make : rows:int
-> columns:int
-> interval:float
-> rules: (module RULE) list
; bar : string
}
- let create ~rows:rs ~columns:ks ~interval ~rules =
+ let make ~rows:rs ~columns:ks ~interval ~rules =
let n = List.length rules in
let init () =
let rule = List.nth_exn rules (Random.int n) in
let module Rule = (val rule : RULE) in
{ rule
- ; data = Rule.create ()
+ ; data = Rule.init ()
}
in
Terminal.clear ();
- { grid = Matrix.map ~f:init (Matrix.create ~rs ~ks ())
+ { grid = Matrix.map ~f:init (Matrix.make ~rs ~ks ())
; interval = Time.Span.of_float interval
; bar = String.make ks '-'
}
; (module ForestFire : RULE)
]
in
- Automaton.loop (Automaton.create ~rows:(rows - 3) ~columns ~interval ~rules)
+ Automaton.loop (Automaton.make ~rows:(rows - 3) ~columns ~interval ~rules)
let spec =