]> git.ameliathe1st.gay Git - cells.git/commitdiff
Implémentation basique de l'évaluateur d'automates
authorAmélia Coutard-Sander <git@ameliathe1st.gay>
Thu, 12 Dec 2024 22:46:51 +0000 (23:46 +0100)
committerAmélia Coutard-Sander <git@ameliathe1st.gay>
Thu, 12 Dec 2024 22:46:51 +0000 (23:46 +0100)
automata/automata.ml
automata/automata.mli

index 639bcee1d86973e842699ce14c4f3b8b36966482..7b90be532bbf31561724b57e9de7794844de4fc1 100644 (file)
@@ -31,4 +31,22 @@ module type Automaton = sig
   val color : t -> char * char * char
 end
 
+(* TODO: infinite board *)
+type 't board = 't * 't array array
+
+let initial (type t) (m : (module Automaton with type t = t)) =
+        let module M = (val m) in
+        (M.default, Array.make_matrix 64 64 M.default)
+
+let get x y (d, board) = if x < 0 || 63 < x || y < 0 || 63 < y then d else board.(x).(y)
+
+let set x y c (_, board) = if x < 0 || 63 < x || y < 0 || 63 < y then () else board.(x).(y) <- c
+
+let update (type t) (m : (module Automaton with type t = t)) ((d, cells) as board) =
+        let module M = (val m) in
+        ( M.transition (List.map (Fun.const d) M.neighbours) d,
+          Array.init 64 (fun x ->
+              Array.init 64 (fun y ->
+                  M.transition (List.map (fun (dx, dy) -> get (x + dx) (y + dy) board) M.neighbours) cells.(x).(y))) )
+
 let automata = [(module Life : Automaton); (module Wireworld : Automaton)]
index 40a67b384c128adc36e18f525fd9b4468fa51ec1..2e1d96a91cb8a514afa8fe32aeae3798796beb6f 100644 (file)
@@ -31,4 +31,14 @@ module type Automaton = sig
   val color : t -> char * char * char
 end
 
+type 't board
+
+val initial : (module Automaton with type t = 't) -> 't board
+
+val get : int -> int -> 't board -> 't
+
+val set : int -> int -> 't -> 't board -> unit
+
+val update : (module Automaton with type t = 't) -> 't board -> 't board
+
 val automata : (module Automaton) list