code: def next(self) -> mx.io.DataBatch:
          
          if not self.iter_next():
              raise StopIteration
  
          i, j = self.batch_indices[self.curr_batch_index]
          self.curr_batch_index += 1
  
          batch_size = self.bucket_batch_sizes[i].batch_size
          source = self.data.source[i][j:j + batch_size]
          target = self.data.target[i][j:j + batch_size]
          data = [source, target]
          label = [self.data.label[i][j:j + batch_size]]
  
          provide_data = [mx.io.DataDesc(name=n, shape=x.shape, layout=C.BATCH_MAJOR) for n, x in
                          zip(self.data_names, data)]
          provide_label = [mx.io.DataDesc(name=n, shape=x.shape, layout=C.BATCH_MAJOR) for n, x in
                           zip(self.label_names, label)]
  
          # TODO: num pad examples is not set here if fillup policy would be padding
          return mx.io.DataBatch(data, label,
                                 pad=0, index=None, bucket_key=self.buckets[i],
                                 provide_data=provide_data, provide_label=provide_label)
docs: Returns the next batch from the data iterator.