docs: def split_indexes(
      dims_or_levels,  # type: Union[Any, List[Any]]
      variables,  # type: OrderedDict[Any, Variable]
      coord_names,  # type: Set
      level_coords,  # type: Dict[Any, Any]
      drop=False,  # type: bool
  ):
      # type: (...) -> Tuple[OrderedDict[Any, Variable], Set]
      """Extract (multi-)indexes (levels) as variables.
  
      Not public API. Used in Dataset and DataArray reset_index
      methods.
      """
      if isinstance(dims_or_levels, str):
          dims_or_levels = [dims_or_levels]
  
      dim_levels = defaultdict(list)  # type: Dict[Any, list]
      dims = []
      for k in dims_or_levels:
          if k in level_coords:
              dim_levels[level_coords[k]].append(k)
          else:
              dims.append(k)
  
      vars_to_replace = {}
      vars_to_create = OrderedDict()  # type: OrderedDict[Any, Variable]
      vars_to_remove = []
  
      for d in dims:
          index = variables[d].to_index()
          if isinstance(index, pd.MultiIndex):
              dim_levels[d] = index.names
          else:
              vars_to_remove.append(d)
              if not drop:
                  vars_to_create[d + '_'] = Variable(d, index)
  
      for d, levs in dim_levels.items():
          index = variables[d].to_index()
          if len(levs) == index.nlevels:
              vars_to_remove.append(d)
          else:
              vars_to_replace[d] = IndexVariable(d, index.droplevel(levs))
  
          if not drop:
              for lev in levs:
                  idx = index.get_level_values(lev)
                  vars_to_create[idx.name] = Variable(d, idx)
  
      new_variables = variables.copy()
      for v in set(vars_to_remove):
          del new_variables[v]
      new_variables.update(vars_to_replace)
      new_variables.update(vars_to_create)
      new_coord_names = (coord_names | set(vars_to_create)) - set(vars_to_remove)
  
      return new_variables, new_coord_names