]> git.ameliathe1st.gay Git - cells.git/commitdiff
Ajout d'une sérialisation/dé-sérialisation des plateaux de cellules
authorAmélia Coutard-Sander <git@ameliathe1st.gay>
Sat, 4 Jan 2025 02:42:19 +0000 (03:42 +0100)
committerAmélia Coutard-Sander <git@ameliathe1st.gay>
Sat, 4 Jan 2025 02:42:19 +0000 (03:42 +0100)
automata/automata.ml
automata/automata.mli
automata/automata/brain.ml
automata/automata/cont.ml
automata/automata/life.ml
automata/automata/maze.ml
automata/automata/wireworld.ml
bin/modes.ml

index 95924448706efcc2ce2e5d10dbaed18ba5652669..eaa8467d966edab0f781f1547f81bb81569a9c54 100644 (file)
@@ -37,6 +37,10 @@ module type Automaton = sig
   val next : t -> t
 
   val color : t -> char * char * char
+
+  val of_string : string -> t
+
+  val to_string : t -> string
 end
 
 module Coord = struct
@@ -121,6 +125,36 @@ let update (type t) (m : (module Automaton with type t = t)) (d, board) =
             CoordMap.empty ccoords
           |> CoordMap.filter (fun _ -> Array.exists (Array.exists (fun c -> c <> d))) )
 
+let deserialise (type t) (m : (module Automaton with type t = t)) channel =
+        let module M = (val m) in
+        let d = Option.get (In_channel.input_line channel) |> M.of_string in
+        let board =
+                let rec aux board =
+                        match In_channel.input_line channel with
+                        | None -> board
+                        | Some x ->
+                                let x = int_of_string x
+                                and y = In_channel.input_line channel |> Option.get |> int_of_string in
+                                let chunk =
+                                        Array.init chunk_size (fun _ ->
+                                            Array.init chunk_size (fun _ ->
+                                                In_channel.input_line channel |> Option.get |> M.of_string))
+                                in
+                                aux (CoordMap.add (x, y) chunk board)
+                in
+                aux CoordMap.empty
+        in
+        (d, board)
+
+let serialise (type t) (m : (module Automaton with type t = t)) (d, board) channel =
+        let module M = (val m) in
+        Printf.fprintf channel "%s\n" (M.to_string d);
+        CoordMap.iter
+          (fun (x, y) chunk ->
+            Printf.fprintf channel "%d\n%d\n" x y;
+            Array.iter (Array.iter (fun c -> Printf.fprintf channel "%s\n" (M.to_string c))) chunk)
+          board
+
 let automata =
         [
           (module Life : Automaton);
index 69aeab8060fe328dbf241fa0a2c075b8ba41c9f0..3f871ebcca5cb2fe4402b7ea06c8f0c297dc9309 100644 (file)
@@ -37,6 +37,10 @@ module type Automaton = sig
   val next : t -> t
 
   val color : t -> char * char * char
+
+  val of_string : string -> t
+
+  val to_string : t -> string
 end
 
 type 't board
@@ -50,3 +54,7 @@ val set : int -> int -> 't -> 't board -> 't board
 val update : (module Automaton with type t = 't) -> 't board -> 't board
 
 val automata : (module Automaton) list
+
+val deserialise : (module Automaton with type t = 't) -> in_channel -> 't board
+
+val serialise : (module Automaton with type t = 't) -> 't board -> out_channel -> unit
index 15c6e20a6a022e80a0e2d4f3b84368ee1139a0cc..5de9e9dddf897ccdcf08279ffa4ab0852b1185ff 100644 (file)
@@ -53,3 +53,14 @@ let color = function
         | Off -> ('\x00', '\x00', '\x1F')
         | On -> ('\xFF', '\xFF', '\xFF')
         | Dying -> ('\x00', '\x00', '\xFF')
+
+let of_string = function
+        | "D" -> Off
+        | "A" -> On
+        | "Y" -> Dying
+        | _ -> failwith "Unparseable"
+
+let to_string = function
+        | Off -> "D"
+        | On -> "A"
+        | Dying -> "Y"
index 12ec040e4347eacbf36753d3f6b469fb43c959cc..0d0ec9e378310efed08606e74142f100ff1a5ae3 100644 (file)
@@ -42,3 +42,7 @@ let color c =
                 |> char_of_int
         in
         if c > 0. then (v, '\x00', '\x00') else ('\x00', '\x00', v)
+
+let of_string = float_of_string
+
+let to_string = string_of_float
index 6876caea8ead3f2d0cc4c014fb71f32b8eb0cb89..16f9c1b9b9df05ae1da560982ec48e25c7c130c9 100644 (file)
@@ -46,3 +46,12 @@ let next = function
 let color = function
         | Dead -> ('\x00', '\x00', '\x1F')
         | Alive -> ('\xFF', '\xFF', '\xFF')
+
+let of_string = function
+        | "D" -> Dead
+        | "A" -> Alive
+        | _ -> failwith "Unparseable"
+
+let to_string = function
+        | Dead -> "D"
+        | Alive -> "A"
index 4e9addadbaddb1bfa0dda07285b5ff51f942906c..1181c4c75189cfb5c3d555041b8b9e6cc86b3091 100644 (file)
@@ -46,3 +46,12 @@ let next = function
 let color = function
         | Sol -> ('\x00', '\x00', '\x1F')
         | Mur -> ('\xFF', '\xFF', '\xFF')
+
+let of_string = function
+        | "S" -> Sol
+        | "M" -> Mur
+        | _ -> failwith "Unparseable"
+
+let to_string = function
+        | Sol -> "S"
+        | Mur -> "M"
index 895944d556a52153645151903ca63642aa91e377..a040a03f3d182cb81d7aa385b016230c9df70687 100644 (file)
@@ -57,3 +57,16 @@ let color = function
         | Conductor -> ('\xBF', '\xBF', '\x00')
         | Head -> ('\xBF', '\x00', '\x00')
         | Tail -> ('\x00', '\x00', '\xBF')
+
+let of_string = function
+        | "0" -> Empty
+        | "C" -> Conductor
+        | "H" -> Head
+        | "T" -> Tail
+        | _ -> failwith "Unparseable"
+
+let to_string = function
+        | Empty -> "0"
+        | Conductor -> "C"
+        | Head -> "H"
+        | Tail -> "T"
index d7414f9a4b05c018f3ebc0263051a33a12be9307..80419ea4e92c518b151ec116fab727a00f736772 100644 (file)
@@ -134,6 +134,12 @@ functor
               | 'l' -> Either.left (ntimes (chpos 1 0) st)
               | 'i' -> Either.left (ntimes (chsize 1) st)
               | 'o' -> Either.left (ntimes (chsize (-1)) st)
+              | 'w' ->
+                      Out_channel.with_open_text "test.auto" (Automata.serialise (module M) st.board);
+                      Either.left st
+              | 'r' ->
+                      Either.left
+                        { st with board = In_channel.with_open_text "test.auto" (Automata.deserialise (module M)) }
               | _ -> Either.left st
     end