package spliterator;
import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.StreamSupport;
public class ArraySpliterator implements Spliterator{
A[] as;
int start;
int end;
public ArraySpliterator(A[] as) {
this(as,0,as.length);
}
public ArraySpliterator(A[] as, int start, int end) {
super();
this.as = as;
this.start = start;
this.end = end;
}
@Override
public boolean tryAdvance(Consumer super A> action) {
if (start>=end) return false;
action.accept(as[start++]);
return true;
}
@Override
public Spliterator trySplit() {
var n = end-start;
if (n<4) return null;
var middle = start+n/2;
var result = new ArraySpliterator(as, middle, end);
end = middle;
return result;
}
@Override
public long estimateSize() {
return end-start;
}
@Override
public int characteristics() {
return 0;
}
public static void main(String[] args) {
String[] xs = {"Das","Pferd","frisst","keinen","Gurkensalat"};
var split1 = new ArraySpliterator<>(xs);
// while(split1.tryAdvance(x->System.out.println(x.toUpperCase())));
var stream1 = StreamSupport.stream(split1, false);
stream1.filter(x->x.length()>3).forEach(x->System.out.println(x));
Integer[] is = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
var stream2 = StreamSupport.stream(new ArraySpliterator<>(is),true);
stream2.forEach(i -> System.out.print(i+" "));
}
}