function ndarray2fancy( x ) {
		var opts;
		var err;
		var arr;
		var dt;
		var o;

		if ( !isndarrayLike( x ) ) {
			throw new TypeError( format( 'invalid argument. First argument must be an ndarray. Value: `%s`.', x ) );
		}
		if ( hasProxySupport ) {
			opts = assign( {}, OPTIONS );
			if ( arguments.length > 1 ) {
				err = validate( opts, arguments[ 1 ] );
				if ( err ) {
					throw err;
				}
			}
			arr = ndarraylike2object( x );
			dt = arr.dtype || '';
			o = {
				'ref': x,
				'dtype': dt,
				'getter': getter( x ),
				'setter': setter( x ),
				'preSetElement': setElementWrapper( dt ),
				'postGetArray': getArrayWrapper( ndarray2fancy, opts ),
				'cache': opts.cache,
				'strict': opts.strict,
				'validator': validator( dt ),
				'ndarray2fancy': ndarray2fancy,
				'ctor': new Proxy( x.constructor || ndarray, {
					'construct': ctor( ndarray2fancy, opts )
				}),
				'prop2slice': prop2slice( arr.shape.length ) // WARNING: we assume a fixed number of dimensions!
			};
			return new Proxy( x, {
				'get': get( o ),
				'set': set( o )
			});
		}
		// TODO: replace with `@stdlib/console/warn` (or equivalent once available)
		console.warn( 'WARNING: Proxy objects are not supported in the current environment. Some fancy functionality may not be available.' ); // eslint-disable-line no-console
		return x;
	}
Converts an ndarray to an object supporting fancy indexing.

@private
@param {ndarrayLike} x - input ndarray
@param {Options} [options] - function options
@param {boolean} [options.strict] - boolean indicating whether to enforce strict bounds checking
@param {Function} [options.cache] - cache for resolving array index objects
@throws {TypeError} first argument must be ndarray-like
@throws {TypeError} options argument must be an object
@throws {TypeError} must provide valid options
@returns {ndarrayLike} fancy ndarray