docs: def zip_with(fun: Callable, xs: Iterable, ys: Iterable):
      """
      Fuse two Iterable object using the function `fun`.
      Notice that if the two objects have different len,
      the shortest object gives the result's shape.
  
      :param fun:
         function taking two argument use to process
         element x from `xs` and y from `ys`.
  
      :param xs:
         first iterable.
  
      :param ys:
         second iterable.
  
      returns::py:class:`PromisedObject`
      """
      generator = (fun(*rs) for rs in zip(xs, ys))
  
      return gather(*generator)