class_docstr: An operator that zips its inputs together.
  
  NOTE: the implementation is bulk for now, which materializes all its inputs in
  object store, before starting execution. Should re-implement it as a streaming
  operator in the future.
class_docstr_tok: ["An","operator","that","zips","its","inputs","together",".","NOTE",":","the","implementation","is","bulk","for","now",",","which","materializes","all","its","inputs","in","object","store",",","before","starting","execution",".","Should","re-implement","it","as","a","streaming","operator","in","the","future","."]
code: def has_next(self) -> bool:
      return len(self._output_buffer) > 0
  
imports: import itertools
  from typing import List, Tuple
  import ray
  from ray.data._internal.delegating_block_builder import DelegatingBlockBuilder
  from ray.data._internal.execution.interfaces import PhysicalOperator, RefBundle
  from ray.data._internal.remote_fn import cached_remote_fn
  from ray.data._internal.split import _split_at_indices
  from ray.data._internal.stats import StatsDict
  from ray.data.block import Block, BlockAccessor, BlockExecStats, BlockMetadata, BlockPartition
label_desc: Use image node_id 5 for calling the ZipOperator obj's underlying member method code with example usage: obj.has_next() and returns: unknown