MCPcopy Index your code
hub / github.com/clojure/clojure / SubVector

Class SubVector

src/jvm/clojure/lang/APersistentVector.java:610–698  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

608}
609
610public static class SubVector extends APersistentVector implements IObj, IKVReduce{
611 public final IPersistentVector v;
612 public final int start;
613 public final int end;
614 final IPersistentMap _meta;
615
616
617
618 public SubVector(IPersistentMap meta, IPersistentVector v, int start, int end){
619 this._meta = meta;
620
621 if(v instanceof APersistentVector.SubVector)
622 {
623 APersistentVector.SubVector sv = (APersistentVector.SubVector) v;
624 start += sv.start;
625 end += sv.start;
626 v = sv.v;
627 }
628 this.v = v;
629 this.start = start;
630 this.end = end;
631 }
632
633 public Iterator iterator(){
634 if (v instanceof APersistentVector) {
635 return ((APersistentVector)v).rangedIterator(start,end);
636 }
637 return super.iterator();
638 }
639
640 @Override
641 public Spliterator spliterator(){
642 return ((APersistentVector)v).rangedSpliterator(start,end);
643 }
644
645 public Object kvreduce(IFn f, Object init){
646 int cnt = count();
647 for (int i=0; i<cnt; i++){
648 init = f.invoke(init, i, v.nth(start + i));
649 if (RT.isReduced(init))
650 return ((IDeref)init).deref();
651 }
652 return init;
653 }
654
655 public Object nth(int i){
656 if((start + i >= end) || (i < 0))
657 throw new IndexOutOfBoundsException();
658 return v.nth(start + i);
659 }
660
661 public IPersistentVector assocN(int i, Object val){
662 if(start + i > end)
663 throw new IndexOutOfBoundsException();
664 else if(start + i == end)
665 return cons(val);
666 return new SubVector(_meta, v.assocN(start + i, val), start, end);
667 }

Callers

nothing calls this directly

Calls

no outgoing calls

Tested by

no test coverage detected