class_docstr: Create mini-batches of data (functional name: ``batch``).
  
  An outer dimension will be added as ``batch_size`` if ``drop_last`` is set to ``True``,
  or ``length % batch_size`` for the last batch if ``drop_last`` is set to ``False``.
  
  Args:
      datapipe: Iterable DataPipe being batched
      batch_size: The size of each batch
      drop_last: Option to drop the last batch if it's not full
  
  Example:
      >>> # xdoctest: +SKIP
      >>> from torchdata.datapipes.map import SequenceWrapper
      >>> dp = SequenceWrapper(range(10))
      >>> batch_dp = dp.batch(batch_size=2)
      >>> list(batch_dp)
      [[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
code: def __getitem__(self, index) -> DataChunk:
      batch: List = []
      indices = range(
          index * self.batch_size, (index + 1) * self.batch_size
      )
      try:
          for i in indices:
              batch.append(self.datapipe[i])
          return self.wrapper_class(batch)
      except IndexError as e:
          if not self.drop_last and len(batch) > 0:
              return self.wrapper_class(batch)
          else:
              raise IndexError(f"Index {index} is out of bound.") from e
  
imports: from torch.utils.data.datapipes._decorator import functional_datapipe
  from torch.utils.data.datapipes.datapipe import MapDataPipe, DataChunk
  from typing import List, Sized, TypeVar
label_desc: Use image node_id 2 for calling the BatcherMapDataPipe obj's underlying member method code with example usage: obj.__getitem__(index) and returns: self, self