Source: ix_.mjs

import { tester, array, asarray, NDArray, nonzero } from './core.mjs';

/**
 * @param  {...number[]|boolean[]} args
 * @returns {NDArray[]}
 */
export function ix_(...args) {
	let out = [];
	let nd = args.length;
	for (let k = 0; k < nd; k++) {
		let idx = args[k];
		idx = asarray(idx);
		if (idx.ndim != 1) {
			`cross index must be 1 dimensional`;
		}
		if (typeof idx.item(0) == 'boolean') {
			[idx] = nonzero(idx);
		}
		idx = idx.reshape([...Array(k).fill(1), idx.size, ...Array(nd - k - 1).fill(1)]);
		out.push(idx);
	}
	return out;
}

process.env.PRODUCTION ||
	tester
		.add(
			ix_,
			() => ix_([0, 1], [2, 4]),
			() => [array([[0], [1]]), array([[2, 4]])]
		)
		.add(
			ix_,
			() => ix_([true, true], [2, 4]),
			() => [array([[0], [1]]), array([[2, 4]])]
		)
		.add(
			ix_,
			() => ix_([true, true], [false, false, true, false, true]),
			() => [array([[0], [1]]), array([[2, 4]])]
		);