public static <T> PrefetchableIterable<T> limit(Iterable<T> iterable, int limit) {
    PrefetchableIterable<T> prefetchableIterable = maybePrefetchable(iterable);
    return new Default<T>() {
      @Override
      public PrefetchableIterator<T> createIterator() {
        return new PrefetchableIterator<T>() {
          PrefetchableIterator<T> delegate = prefetchableIterable.iterator();
          int currentPosition;

          @Override
          public boolean isReady() {
            if (currentPosition < limit) {
              return delegate.isReady();
            }
            return true;
          }

          @Override
          public void prefetch() {
            if (!isReady()) {
              delegate.prefetch();
            }
          }

          @Override
          public boolean hasNext() {
            if (currentPosition != limit) {
              return delegate.hasNext();
            }
            return false;
          }

          @Override
          public T next() {
            if (!hasNext()) {
              throw new NoSuchElementException();
            }
            currentPosition += 1;
            return delegate.next();
          }
        };
      }
    };
  }
@Test
  public void testLimit() {
    verifyIterable(PrefetchableIterables.limit(PrefetchableIterables.fromArray(), 0));
    verifyIterable(PrefetchableIterables.limit(PrefetchableIterables.fromArray(), 1));
    verifyIterable(PrefetchableIterables.limit(PrefetchableIterables.fromArray("A", "B", "C"), 0));
    verifyIterable(
        PrefetchableIterables.limit(PrefetchableIterables.fromArray("A", "B", "C"), 2), "A", "B");
    verifyIterable(
        PrefetchableIterables.limit(PrefetchableIterables.fromArray("A", "B", "C"), 3),
        "A",
        "B",
        "C");
    verifyIterable(
        PrefetchableIterables.limit(PrefetchableIterables.fromArray("A", "B", "C"), 4),
        "A",
        "B",
        "C");
  }