summaryrefslogtreecommitdiff
path: root/2024/OCaml/lib/grid
diff options
context:
space:
mode:
Diffstat (limited to '2024/OCaml/lib/grid')
-rw-r--r--2024/OCaml/lib/grid/cell.ml18
-rw-r--r--2024/OCaml/lib/grid/cell.mli18
-rw-r--r--2024/OCaml/lib/grid/grid.ml14
-rw-r--r--2024/OCaml/lib/grid/grid.mli6
4 files changed, 56 insertions, 0 deletions
diff --git a/2024/OCaml/lib/grid/cell.ml b/2024/OCaml/lib/grid/cell.ml
new file mode 100644
index 0000000..186e451
--- /dev/null
+++ b/2024/OCaml/lib/grid/cell.ml
@@ -0,0 +1,18 @@
+type t = {
+ value : string;
+ up : t option;
+ down : t option;
+ left : t option;
+ right : t option;
+}
+
+let create value = { value; up = None; down = None; left = None; right = None }
+let with_up up c = { c with up = Some up }
+let with_down down c = { c with down = Some down }
+let with_left left c = { c with left = Some left }
+let with_right right c = { c with right = Some right }
+let move_up co = match co with Some c -> c.up | None -> None
+let move_down co = match co with Some c -> c.down | None -> None
+let move_left co = match co with Some c -> c.left | None -> None
+let move_right co = match co with Some c -> c.right | None -> None
+let ( = ) c1 c2 = c1.value = c2.value
diff --git a/2024/OCaml/lib/grid/cell.mli b/2024/OCaml/lib/grid/cell.mli
new file mode 100644
index 0000000..e61e34a
--- /dev/null
+++ b/2024/OCaml/lib/grid/cell.mli
@@ -0,0 +1,18 @@
+type t = {
+ value : string;
+ up : t option;
+ down : t option;
+ left : t option;
+ right : t option;
+}
+
+val create : string -> t
+val with_up : t -> t -> t
+val with_down : t -> t -> t
+val with_left : t -> t -> t
+val with_right : t -> t -> t
+val move_up : t option -> t option
+val move_down : t option -> t option
+val move_left : t option -> t option
+val move_right : t option -> t option
+val ( = ) : t -> t -> bool
diff --git a/2024/OCaml/lib/grid/grid.ml b/2024/OCaml/lib/grid/grid.ml
new file mode 100644
index 0000000..0d6bc4c
--- /dev/null
+++ b/2024/OCaml/lib/grid/grid.ml
@@ -0,0 +1,14 @@
+let rec to_grid_aux tokens max_width acc =
+ match tokens with
+ | [] -> acc
+ | h :: t ->
+ let new_cell = Cell.create h |> Cell.with_left acc in
+ let new_acc = acc |> Cell.with_right new_cell in
+ to_grid_aux t max_width new_acc
+
+let to_grid tokens max_width : Cell.t option =
+ match tokens with
+ | [] -> None
+ | h :: t ->
+ let first_cell = Cell.create h in
+ Some (to_grid_aux t max_width first_cell)
diff --git a/2024/OCaml/lib/grid/grid.mli b/2024/OCaml/lib/grid/grid.mli
new file mode 100644
index 0000000..31c4329
--- /dev/null
+++ b/2024/OCaml/lib/grid/grid.mli
@@ -0,0 +1,6 @@
+val to_grid : string list -> int -> Cell.t option
+(** The cell in the top left corner of the grid is returned where each element
+ of [tokens] is converted into rows with [width]. An empty list of [tokens]
+ returns None. Requires: [width] is greater than 0 **)
+
+val print : Cell.t -> ()