code: public static <T> Source<T> join(final Iterator<Source<T>> iterator) {
          return new AbstractSource<T>() {
              private Source<T> current = popSource();
  
              @Override
              public T computeNext() throws IOException {
                  while (current != null) {
                      if (current.hasNext()) {
                          return current.next();
                      } else {
                          current.close();
                          current = popSource();
                      }
                  }
                  return endOfData();
              }
  
              @Override
              public void close() {
                  while (current != null) {
                      current.close();
                      current = popSource();
                  }
              }
  
              private Source<T> popSource() {
                  if (iterator.hasNext()) {
                      return iterator.next();
                  } else {
                      return null;
                  }
              }
          };
      }
docs: Gets a source that joins the given iterator of sources end to end.
  <p>
  When closed, the returned source will ensure the wrapped sources are
  all closed.
  
  @param iterator the sources to join.
  @param <T> the type.
  @return the joined source.