function unshift( arr, items ) {
	var nbytes;
	var ibytes;
	var offset;
	var total;
	var len;
	var buf;
	var n;
	var v;
	var i;

	len = arr.length;
	n = items.length;

	ibytes = n * arr.BYTES_PER_ELEMENT;
	offset = arr.byteOffset;

	if ( offset < ibytes ) {
		nbytes = len * arr.BYTES_PER_ELEMENT;
		total = nbytes + ibytes + offset;
		buf = new ArrayBuffer( ceil2( total+1 ) );
		offset = buf.byteLength - nbytes - ibytes;
		v = new arr.constructor( buf, offset, len+n );
		for ( i = 0; i < len; i++ ) {
			v[ i+n ] = arr[ i ];
		}
	} else {
		offset -= ibytes;
		v = new arr.constructor( arr.buffer, offset, len+n );
	}
	for ( i = 0; i < n; i++ ) {
		v[ i ] = items[ i ];
	}
	return v;
}
Adds one or more elements to the beginning of a typed array.

## Notes

-   If the underlying `ArrayBuffer` is too short, we need to copy the data to a new `ArrayBuffer`. To do so, we allocate a new `ArrayBuffer` in a manner similar to how `Arrays` are resized (i.e., allocate enough memory to hold `nextpow2(n)` elements).
-   Beware that, if an ArrayBuffer view is preceded by one or more other views, the created view may contain elements from those views, thus resulting in possible mutation. Accordingly, providing a typed array view having a shared underlying `ArrayBuffer` may have unintended consequences (including security vulnerabilities).

@private
@param {TypedArray} arr - input array
@param {Array} items - items to add
@returns {TypedArray} input array

@example
var Float64Array = require( '@stdlib/array/float64' );

var arr = new Float64Array( [ 1.0, 2.0, 3.0, 4.0, 5.0 ] );
// returns <Float64Array>[ 1.0, 2.0, 3.0, 4.0, 5.0 ]

arr = unshift( arr, 6.0, 7.0 );
// returns <Float64Array>[ 6.0, 7.0, 1.0, 2.0, 3.0, 4.0, 5.0 ]