function cartesianProduct( x1, x2 ) {
	var get1;
	var get2;
	var out;
	var M;
	var N;
	var v;
	var i;
	var j;

	get1 = resolveGetter( x1 );
	get2 = resolveGetter( x2 );

	M = x1.length;
	N = x2.length;
	out = [];
	for ( i = 0; i < M; i++ ) {
		v = get1( x1, i );
		for ( j = 0; j < N; j++ ) {
			out.push( [ v, get2( x2, j ) ] );
		}
	}
	return out;
}
Returns the Cartesian product.

@param {Collection} x1 - first input array
@param {Collection} x2 - second input array
@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 ] ]