src/main/java/org/organicdesign/fp/collections/PersistentVector.java
@SuppressWarnings("unchecked")
    @Override public PersistentVector<E> append(E val) {
        //room in tail?
        //	if(tail.length < MAX_NODE_LENGTH)
        if (size - tailoff() < MAX_NODE_LENGTH) {
            E[] newTail = (E[]) new Object[tail.length + 1];
            System.arraycopy(tail, 0, newTail, 0, tail.length);
            newTail[tail.length] = val;
            return new PersistentVector<>(size + 1, shift, root, newTail);
        }
        //full tail, push into tree
        Node newroot;
        Node tailnode = new Node(root.edit, tail);
        int newshift = shift;
        //overflow root?
        if ((size >>> NODE_LENGTH_POW_2) > (1 << shift)) {
            newroot = new Node(root.edit);
            newroot.array[0] = root;
            newroot.array[1] = newPath(root.edit, shift, tailnode);
            newshift += NODE_LENGTH_POW_2;
        } else {
            newroot = pushTail(shift, root, tailnode);
        }
        return new PersistentVector<>(size + 1, newshift, newroot, (E[]) new Object[]{val});
    }
@SuppressWarnings("unchecked")
    @Override public PersistentVector<E> append(E val) {
        //room in tail?
        //	if(tail.length < MAX_NODE_LENGTH)
        if (size - tailoff() < MAX_NODE_LENGTH) {
            E[] newTail = (E[]) new Object[tail.length + 1];
            System.arraycopy(tail, 0, newTail, 0, tail.length);
            newTail[tail.length] = val;
            return new PersistentVector<>(size + 1, shift, root, newTail);
        }
        //full tail, push into tree
        Node newroot;
        Node tailnode = new Node(root.edit, tail);
        int newshift = shift;
        //overflow root?
        if ((size >>> NODE_LENGTH_POW_2) > (1 << shift)) {
            newroot = new Node(root.edit);
            newroot.array[0] = root;
            newroot.array[1] = newPath(root.edit, shift, tailnode);
            newshift += NODE_LENGTH_POW_2;
        } else {
            newroot = pushTail(shift, root, tailnode);
        }
        return new PersistentVector<>(size + 1, newshift, newroot, (E[]) new Object[]{val});
    }
@ SuppressWarnings ( "unchecked" ) @ Override public PersistentVector < E > append ( E val ) { //room in tail? //	if(tail.length < MAX_NODE_LENGTH) if ( size - tailoff ( ) < MAX_NODE_LENGTH ) { E [ ] newTail = ( E [ ] ) new Object [ tail . length + 1 ] ; System . arraycopy ( tail , 0 , newTail , 0 , tail . length ) ; newTail [ tail . length ] = val ; return new PersistentVector <> ( size + 1 , shift , root , newTail ) ; } //full tail, push into tree Node newroot ; Node tailnode = new Node ( root . edit , tail ) ; int newshift = shift ; //overflow root? if ( ( size >>> NODE_LENGTH_POW_2 ) > ( 1 << shift ) ) { newroot = new Node ( root . edit ) ; newroot . array [ 0 ] = root ; newroot . array [ 1 ] = newPath ( root . edit , shift , tailnode ) ; newshift += NODE_LENGTH_POW_2 ; } else { newroot = pushTail ( shift , root , tailnode ) ; } return new PersistentVector <> ( size + 1 , newshift , newroot , ( E [ ] ) new Object [ ] { val } ) ; }
Inserts a new item at the end of the Vecsicle.
@param val the value to insert
@return a new Vecsicle with the additional item.
Inserts a new item at the end of the Vecsicle .