Source: empty.mjs

import { tester, NDArray, dtype_, Dtype, get_size, asarray } from './core.mjs';

/**
 * empty(2) is equivalent to empty([2])
 * @param {number|number[]} shape empty([]) for a scalar ndarray
 * @param {Dtype} [dtype]
 * @returns {NDArray}
 */
export function empty(shape, dtype = undefined) {
	shape = tuple_(shape);
	dtype = dtype_(dtype);
	return new NDArray(shape, dtype.new(get_size(shape)), dtype);
}

/**
 * @param {NDArray} a array-like
 * @param {Dtype} [dtype]
 * @returns {NDArray}
 */
export function empty_like(a, dtype = undefined) {
	a = asarray(a);
	return empty(a.shape, dtype ?? a.dtype);
}

/**
 * Returns an array-like object
 * @param {any} value
 * @returns {any[]}
 * @ignore
 */
export function tuple_(value) {
	// all falsy values are scalars
	if (!value) return [value];

	// object that supports .toarray() method
	if (typeof value.toarray == 'function') value = value.toarray();

	// array-like object
	if (typeof value == 'object' && value.length != undefined) return value;

	return [value];
}

process.env.PRODUCTION ||
	tester
		.add(
			'empty',
			() => empty([2, 2]),
			() => [
				[, ,],
				[, ,],
			]
		)
		.add(
			'empty',
			() => empty(0),
			() => []
		)
		.add(
			'empty',
			() => empty([]),
			() => undefined
		);

process.env.PRODUCTION ||
	tester
		.add(
			'empty_like',
			() =>
				empty_like([
					[1, 2, 3],
					[4, 5, 6],
				]),
			() => [
				[, , ,],
				[, , ,],
			]
		)
		.add(
			'empty_like',
			() => empty_like([1, 2, 3, [1, 3]]),
			() => [, , , ,]
		);