code: public static <T1, T2> Iterator<Pair<Optional<T1>, Optional<T2>>> longest(Iterator<T1> former, Iterator<T2> latter) {
          return new ZipLongestIterator<T1, T2>(former, latter);
      }
docs: Transforms two iterators to an iterator of tuples, containing
  Optional.of(elements) of both iterators occurring at the same position. If
  the iterables are of uneven length, missing values are filled-in with
  Optional.empty(). Iteration continues until the longest iterable is
  exhausted. E.g:
  <code>
  Zip.longest([1,2],['a','b','c']) -> [(of 1,of 'a'),(of 2 ,of 'b'), (empty ,of 'c')]
  </code>
  
  @param <T1> the former element type parameter
  @param <T2> the latter element type parameter
  @param former the former iterator
  @param latter the latter iterator
  @return the resulting longest convolved iterator