public static <T> PrefetchableIterable<T> concat(Iterable<T>... iterables) {
    for (int i = 0; i < iterables.length; ++i) {
      if (iterables[i] == null) {
        throw new IllegalArgumentException("Iterable at position " + i + " was null.");
      }
    }
    if (iterables.length == 0) {
      return emptyIterable();
    } else if (iterables.length == 1) {
      return maybePrefetchable(iterables[0]);
    }
    return new Default<T>() {
      @SuppressWarnings("methodref.receiver")
      @Override
      public PrefetchableIterator<T> createIterator() {
        return PrefetchableIterators.concatIterators(
            FluentIterable.from(iterables).transform(Iterable::iterator).iterator());
      }
    };
  }
@Test
  public void testConcat() {
    verifyIterable(PrefetchableIterables.concat());

    PrefetchableIterable<String> instance = PrefetchableIterables.fromArray("A", "B");
    assertSame(PrefetchableIterables.concat(instance), instance);

    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray()));
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray("A", "B"),
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray()),
        "A",
        "B");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray("C", "D"),
            PrefetchableIterables.fromArray()),
        "C",
        "D");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray("E", "F")),
        "E",
        "F");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray("C", "D"),
            PrefetchableIterables.fromArray("E", "F")),
        "C",
        "D",
        "E",
        "F");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray("A", "B"),
            PrefetchableIterables.fromArray(),
            PrefetchableIterables.fromArray("E", "F")),
        "A",
        "B",
        "E",
        "F");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray("A", "B"),
            PrefetchableIterables.fromArray("C", "D"),
            PrefetchableIterables.fromArray()),
        "A",
        "B",
        "C",
        "D");
    verifyIterable(
        PrefetchableIterables.concat(
            PrefetchableIterables.fromArray("A", "B"),
            PrefetchableIterables.fromArray("C", "D"),
            PrefetchableIterables.fromArray("E", "F")),
        "A",
        "B",
        "C",
        "D",
        "E",
        "F");
  }