code: public static <T> Iterable<T> takeWhile(final Iterable<? extends T> iterable, final Function1<? super T, Boolean> predicate) {
  		if (iterable == null)
  			throw new NullPointerException("iterable");
  		if (predicate == null)
  			throw new NullPointerException("predicate");
  		return new Iterable<T>() {
  			@Override
  			public Iterator<T> iterator() {
  				return IteratorExtensions.takeWhile(iterable.iterator(), predicate);
  			}
  		};
  	}
docs: Returns an Iterable containing all elements starting from the head of the source up to and excluding the first
  element that violates the predicate The resulting Iterable is a lazily computed view, so any modifications to the
  underlying Iterables will be reflected on subsequent iterations. The result's Iterator does not support
  {@link Iterator#remove()}
  
  @param iterable
  the elements from which to take. May not be <code>null</code>.
  @param predicate
  the predicate which decides whether to keep taking elements. May not be <code>null</code>.
  @return the taken elements
  @since 2.7