package org.rdfhdt.hdt.iterator.utils;
import java.util.Iterator;
import java.util.NoSuchElementException;
public class Iter {
private Iter() {}
public static <T, R> Iterable<R> mapIterable(final Iterable<T> iter1, final Transform<T, R> converter) {
return new Iterable<R>() {
@Override
public Iterator<R> iterator() {
return Iter.map(iter1, converter);
}
};
}
public static <T, R> Iterator<R> map(Iterable<? extends T> stream, Transform<T, R> converter) {
return map(stream.iterator(), converter) ;
}
public static <T, R> Iterator<R> map(final Iterator<? extends T> stream, final Transform<T, R> converter) {
final Iterator<R> iter = new Iterator<R>() {
@Override
public boolean hasNext() {
return stream.hasNext() ;
}
@Override
public R next() {
return converter.convert(stream.next()) ;
}
@Override
public void remove() {
throw new UnsupportedOperationException("map.remove") ;
}
} ;
return iter ;
}
public static <T> Iterator<T> filter(Iterable<? extends T> stream, Filter<T> filter) {
return filter(stream.iterator(), filter) ;
}
public static <T> Iterator<T> filter(final Iterator<? extends T> stream, final Filter<T> filter) {
final Iterator<T> iter = new Iterator<T>() {
boolean finished;
boolean slotOccupied;
T slot ;
@Override
public boolean hasNext() {
if ( finished )
return false ;
while (!slotOccupied) {
if ( !stream.hasNext() ) {
finished = true ;
break ;
}
T nextItem = stream.next() ;
if ( filter.accept(nextItem) ) {
slot = nextItem ;
slotOccupied = true ;
break ;
}
}
return slotOccupied ;
}
@Override
public T next() {
if ( hasNext() ) {
slotOccupied = false ;
return slot ;
}
throw new NoSuchElementException("filter.next") ;
}
@Override
public void remove() {
throw new UnsupportedOperationException("filter.remove") ;
}
} ;
return iter ;
}
public static <T> Iterator<T> limit(final Iterator<T> it, final int limit) {
return new Iterator<T>() {
int pos;
@Override
public boolean hasNext() {
return pos<limit && it.hasNext();
}
@Override
public T next() {
return it.next();
}
@Override
public void remove() {
it.remove();
}
};
}
public static <T> Iterator<T> empty() {
return new Iterator<T>() {
@Override
public boolean hasNext() {
return false;
}
@Override
public T next() {
throw new NoSuchElementException();
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
}