diff --git a/.ocamlinit b/.ocamlinit index f0145ae..cfe2248 100644 --- a/.ocamlinit +++ b/.ocamlinit @@ -1 +1,2 @@ #install_printer Aoc.Vec2.pp;; +#install_printer Aoc.Vec2.pp_grid;; diff --git a/src/vec2.ml b/src/vec2.ml index 775caf9..6704ca7 100644 --- a/src/vec2.ml +++ b/src/vec2.ml @@ -1,7 +1,13 @@ open Containers type t = int * int [@@deriving show] -type 'a grid = 'a array array + +type 'a grid = + { width : int + ; height : int + ; items : 'a array + } +[@@deriving show] let up = 0, 1 let down = 0, -1 @@ -14,24 +20,40 @@ let ( + ) a b = Pair.map_same2 ( + ) a b let ( - ) a b = Pair.map_same2 ( - ) a b let ( = ) a b = Pair.equal ( = ) ( = ) a b -let at grid point = - let x, y = to_tuple point in +let at (grid : 'a grid) (point : t) = + let x, y = point in + if x >= 0 && x < grid.width && y >= 0 && y < grid.height + then Array.get_safe grid.items @@ Int.((grid.width * y) + x) + else None +;; + +let find (grid : 'a grid) pred = let open Option.Infix in - let* row = Array.get_safe grid y in - Array.get_safe row x + let* idx, _ = Array.find_idx pred grid.items in + let y = idx / grid.width in + let x = idx mod grid.width in + Some (x, y) ;; -let parse_grid parse_char lines = - lines - |> Array.of_list - |> Array.map Fun.(String.to_seq %> Seq.map parse_char %> Seq.to_array) +let parse_grid parse_char lines : 'a grid = + match lines with + | first_line :: _ -> + let width = String.length first_line in + let height = List.length lines in + let yeet = + lines + |> List.map String.to_list + |> List.flatten + |> List.map parse_char + |> Array.of_list + in + { width; height; items = yeet } + | _ -> failwith "somethin fucd up" ;; -let iter_grid grid callback = - let grid_h = Array.length grid in - let grid_w = Array.length grid.(0) in - for y = 0 to Int.(grid_h - 1) do - for x = 0 to Int.(grid_w - 1) do +let iter_grid (grid : 'a grid) callback = + for y = 0 to Int.(grid.height - 1) do + for x = 0 to Int.(grid.width - 1) do callback (x, y) done done diff --git a/src/vec2.mli b/src/vec2.mli index c7ecd57..1469ea2 100644 --- a/src/vec2.mli +++ b/src/vec2.mli @@ -1,5 +1,5 @@ type t [@@deriving show] -type 'a grid +type 'a grid [@@deriving show] val up : t val down : t @@ -13,4 +13,5 @@ val ( - ) : t -> t -> t val ( = ) : t -> t -> bool val at : 'a grid -> t -> 'a option val parse_grid : (char -> 'a) -> string list -> 'a grid +val find : 'a grid -> ('a -> bool) -> t option val iter_grid : 'a grid -> (t -> unit) -> unit