package org.osgl.util;
import java.util.Collection;
import java.util.Iterator;
/**
* A {@link C.Traversable} implementation based on an {@link Iterable}
*/
class IterableTrav<T> extends TraversableBase<T> {
private final Iterable<? extends T> data;
IterableTrav(Iterable<? extends T> iterable) {
E.NPE(iterable);
data = iterable;
}
@Override
public Iterator<T> iterator() {
return DelegatingIterator.of(data.iterator(), is(C.Feature.READONLY));
}
@Override
public int size() throws UnsupportedOperationException {
if (data instanceof Collection) {
return ((Collection<?>) data).size();
}
throw new UnsupportedOperationException();
}
@SuppressWarnings("unchecked")
public static <T> C.Traversable<T> of(Iterable<? extends T> iterable) {
if (iterable instanceof C.Traversable) {
return (C.Traversable<T>)iterable;
}
return new IterableTrav<T>(iterable);
}
}