org.snapscript.core.type.extend.IteratorExtension Maven / Gradle / Ivy
package org.snapscript.core.type.extend;
import static java.lang.Boolean.TRUE;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import org.snapscript.common.Consumer;
public class IteratorExtension {
public IteratorExtension() {
super();
}
public Iterator limit(Iterator iterator, int limit) {
return new LimitIterator(iterator, limit);
}
public Iterator filter(Iterator iterator, Consumer filter) {
return new FilterIterator(iterator, filter);
}
public Iterator reverse(Iterator iterator) {
List list = new ArrayList();
while(iterator.hasNext()) {
T value = iterator.next();
list.add(value);
}
if(!list.isEmpty()) {
Collections.reverse(list);
}
return list.iterator();
}
public List gather(Iterator iterator) {
List list = new ArrayList();
while(iterator.hasNext()) {
T value = iterator.next();
list.add(value);
}
return list;
}
private static class FilterIterator implements Iterator {
private Consumer filter;
private Iterator iterator;
private T next;
public FilterIterator(Iterator iterator, Consumer filter) {
this.iterator = iterator;
this.filter = filter;
}
@Override
public boolean hasNext() {
if(next == null) {
while(iterator.hasNext()) {
T value = iterator.next();
Object accept = filter.consume(value);
if(TRUE.equals(accept)) {
next = value;
return true;
}
}
return false;
}
return true;
}
@Override
public T next() {
if(hasNext()) {
T result = next;
next = null;
return result;
}
return null;
}
}
private static class LimitIterator implements Iterator {
private Iterator iterator;
private int limit;
public LimitIterator(Iterator iterator, int limit) {
this.iterator = iterator;
this.limit = limit;
}
@Override
public boolean hasNext() {
return limit > 0 && iterator.hasNext();
}
@Override
public T next() {
if(limit-- > 0) {
return iterator.next();
}
return null;
}
}
}