code: public Gather<T> takeWhile(final Predicate<T> predicate) {
      	final Iterator<T> it = each().iterator();
          return from(new AbstractIterator<T>() {
              protected T computeNext() {
                  if (!it.hasNext()) {
                      return endOfData();
                  }
                  T t = it.next();
                  return predicate.apply(t) ? t : endOfData();
              }
          });
      }
docs: Like {@link #take(int)} but returns {@link Gather} that provides elements as long
  as a predicate returns true.