function cartesianProduct( x1, x2 ) {
	if ( !isCollection( x1 ) ) {
		throw new TypeError( format( 'invalid argument. First argument must be an array-like object. Value: `%s`.', x1 ) );
	}
	if ( !isCollection( x2 ) ) {
		throw new TypeError( format( 'invalid argument. Second argument must be an array-like object. Value: `%s`.', x2 ) );
	}
	return base( x1, x2 );
}
Returns the Cartesian product.

@param {Collection} x1 - first input array
@param {Collection} x2 - second input array
@throws {TypeError} first argument must be a collection
@throws {TypeError} second argument must be a collection
@returns {Array<Array>} list of ordered tuples comprising the Cartesian product

@example
var x1 = [ 1, 2, 3 ];
var x2 = [ 4, 5 ];

var out = cartesianProduct( x1, x2 );
// returns [ [ 1, 4 ], [ 1, 5 ], [ 2, 4 ], [ 2, 5 ], [ 3, 4 ], [ 3, 5 ] ]