package spliterator;

import java.util.Spliterator;
import java.util.function.Consumer;
import java.util.stream.StreamSupport;

public class ArraySpliterator<A> implements Spliterator<A>{
	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<A> trySplit() {
		var n = end-start;
		if (n<4) return null;
		var middle = start+n/2;
		var result = new ArraySpliterator<A>(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+" "));
	}
}
