code: def _split_at_index(
      block_list: BlockList,
      index: int,
  ) -> Tuple[
      List[ObjectRef[Block]],
      List[BlockMetadata],
      List[ObjectRef[Block]],
      List[BlockMetadata],
  ]:
      """Split blocks at the provided index.
      Args:
          blocks_with_metadata: Block futures to split, including the associated metadata.
          index: The (global) index at which to split the blocks.
      Returns:
          The block split futures and their metadata for left and right of the index.
      """
      blocks_splits, metadata_splits = _split_at_indices(
          block_list.get_blocks_with_metadata(),
          [index],
          block_list._owned_by_consumer,
      )
      return (
          blocks_splits[0],
          metadata_splits[0],
          blocks_splits[1],
          metadata_splits[1],
      )
  
file_path: ray/python/ray/data/_internal/split.py
imports: import itertools
  import logging
  from typing import Iterable, List, Tuple, Union
  import ray
  from ray.data._internal.block_list import BlockList
  from ray.data._internal.memory_tracing import trace_deallocation
  from ray.data._internal.remote_fn import cached_remote_fn
  from ray.data.block import Block, BlockAccessor, BlockExecStats, BlockMetadata, BlockPartition
  from ray.types import ObjectRef
label_desc: Use image node_id 10 for calling a global function with example usage: _split_at_index(block_list, index) and returns: blocks_splits,  metadata_splits,  blocks_splits,  metadata_splits