     place_bombs(pid, [coord])
   end
 
+  @doc """
+  Places a bomb on each of the board squares at the given coordinates.
+
+  Returns `:ok` on success, or `{:error, :invalid_coord}` on failure.
+  """
   @spec place_bombs(pid, [coord]) :: :ok | {:error, :invalid_coord}
   def place_bombs(pid, coords) do
     parsed_coords = coords |> Enum.map(&parse_coord(pid, &1))

    end)
  end

  @spec place_random_bombs(pid, pos_integer) :: :ok
  def place_random_bombs(pid, count \\ @bomb_count) do
    board = get(pid)

    |> do_place_bombs(pid)
  end

  @doc """
  Parses, normalizes, and validates a given coordinate.

  It will parse any of the valid `LexibombServer.Board.coord` forms and will
  normalize them to the underlying `LexibombServer.Board.Grid.coord` type. If
  indicating the column with a string, you can use either uppercase or
  lowercase letters, and you may also optionally separate the row and column
  with whitespace.

  Validation also occurs to ensure that the coordinate given is actually
  a square on the board.

  ## Examples

    > LexibombServer.Board.parse_coord "10B"
    {:ok, {10, 2}}
    > LexibombServer.Board.parse_coord "10 b"
    {:ok, {10, 2}}
    > LexibombServer.Board.parse_coord {10, "B"}
    {:ok, {10, 2}}
    > LexibombServer.Board.parse_coord {10, 2}
    {:ok, {10, 2}}
    > LexibombServer.Board.parse_coord {10, ""}
    {:error, :invalid_coord}

  Returns  `{:ok, {row, col}} on success, or {:error, :invalid_coord} on failure.
  """
  @spec parse_coord(pid, coord) :: {:ok, Grid.coord} | {:error, :invalid_coord}
  def parse_coord(pid, coord) when is_binary(coord) do
    {row_string, letter} = coord |> String.split_at(-1)

    try do
