docs: def tabulate(
      obj,
      v_level_indexes=None,
      h_level_indexes=None,
      v_level_visibility=None,
      h_level_visibility=None,
      v_level_sort_keys=None,
      h_level_sort_keys=None,
      v_level_titles=None,
      h_level_titles=None,
      empty="",
  ):
      """Render a nested data structure into a two-dimensional table.
  
      Args:
          obj: The indexable data structure to be rendered, which can
              either be a non-string sequence or a mapping containing other
              sequences and mappings nested to arbitrarily many levels,
              with all the leaf items (which are neither sequences nor
              mappings, excluding strings).
  
          v_level_indexes: An iterable of the zero-based indexes of
              the levels for which the keys/indexes will be displayed
              along the vertical axis of the table. Taken together
              with the levels in h_levels these must represent the
              complete set of levels in the obj data structure. No
              level index should appear in both v_level_indexes and
              h_level_indexes, but all level indexes must appear in
              either v_level_indexes or h_level_indexes. If None,
              the levels not used in h_level_indexes will be used.
              If both v_level_indexes and h_level_indexes are not
              alternate indexes will be used as v_level and h_level
              indexes.
  
          h_level_indexes: An iterable of the zero-based indexes of
              the levels for which the keys/indexes will be displayed
              along the horizontal axis of the table. Taken together
              with the levels in v_levels these must represent the
              complete set of levels in the obj data structure. No
              level index should appear in both h_level_indexes and
              v_level_indexes, but all level indexes must appear in
              either h_level_indexes or v_level_indexes. If None,
              the levels not used in v_level_indexes will be used.
              If both v_level_indexes and h_level_indexes are not
              alternate indexes will be used as v_level and h_level
              indexes.
  
          v_level_visibility: An optional iterable of booleans, where each
              item corresponds to a level in v_level_indexes, and
              controls whether than level of index is included in
              the table stub columns. This iterable must contain
              the same number of items as v_level_indexes.
  
          h_level_visibility: An optional iterable of booleans, where each
              item corresponds to a level in h_level_indexes, and
              controls whether than level of index is included in
              the table header rows. This iterable must contain
              the same number of items as h_level_indexes.
  
          v_level_sort_keys: An optional iterable of Keys, where each
              key corresponds to a level in v_level_indexes, and
              controls how that key is sorted. If None, keys are sorted
              as-is.
  
          h_level_sort_keys: An optional iterable of Keys, where each
              key corresponds to a level in v_level_indexes, and
              controls how that key is sorted. If None, keys are sorted
              as-is.
  
          v_level_titles: An optional iterable of strings, where each
              string is a title which corresponds to a level in v_level_indexes,
              and which will be displayed against the row keys for that level.
              If None, no titles will be included.
  
          h_level_titles: An optional iterable of strings, where each
              string is a title which corresponds to a level in h_level_indexes,
              and which will be displayed against the column keys for that level.
              If None, no titles will be included.
  
          empty: An optional string value to use for empty cells.
  
      Returns:
          A list of lists representing the rows of cells.
  
      Example:
  
          tabulate(dict_of_dicts, [0, 1], [])
  
      """
      level_keys = breadth_first(obj)
  
      v_level_indexes, h_level_indexes = validate_level_indexes(
          len(level_keys), v_level_indexes, h_level_indexes
      )
  
      if v_level_visibility is None:
          v_level_visibility = [True] * len(v_level_indexes)
      if h_level_visibility is None:
          h_level_visibility = [True] * len(h_level_indexes)
  
      table, v_key_tuples, h_key_tuples = tabulate_body(
          obj, level_keys, v_level_indexes, h_level_indexes, v_level_sort_keys, h_level_sort_keys
      )
  
      table, v_key_tuples = strip_missing_rows(table, v_key_tuples)
      table, h_key_tuples = strip_missing_columns(table, h_key_tuples)
      v_key_tuples = strip_hidden(v_key_tuples, v_level_visibility)
      h_key_tuples = strip_hidden(h_key_tuples, h_level_visibility)
      return assemble_table(
          table, v_key_tuples, h_key_tuples, v_level_titles, h_level_titles, empty=empty
      )