| 608 | } |
| 609 | |
| 610 | public 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 | } |
nothing calls this directly
no outgoing calls
no test coverage detected