Subato

Nodelist Spliterator

package name.panitz.util.xml;

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

import org.w3c.dom.Node;
import org.w3c.dom.NodeList;

public class NodeListSpliterator implements Spliterator<Node>{
  NodeList ns;
  int start = 0;
  int end;
  public NodeListSpliterator(NodeList ns) {
    this(ns,0,ns.getLength());
 }
  public NodeListSpliterator(NodeList ns, int start, int length) {
    this.ns = ns;
    this.start = start;
    this.end = length;
  }
  
  Stream<Node> stream(){return StreamSupport.stream(this, false);}
  Stream<Node> parallelStream(){return StreamSupport.stream(this, true);}
  
  @Override
  public boolean tryAdvance(Consumer<? super Node> action) {
    if (start >= end) return false;
    action.accept(ns.item(start++));
    return true;
  }
  @Override
  public NodeListSpliterator trySplit() {
    if (end-start < 3) return null;
    int middle = (end+start)/2;
    int oldEnd = end;
    end = middle;
    return new NodeListSpliterator(ns, middle, oldEnd);
  }
  @Override
  public long estimateSize() {
    return end-start;
  }
  @Override
  public int characteristics() {
    // TODO Auto-generated method stub
    return 0;
  }
}