Source: resize.mjs

import { tester, array, zeros, slice, ravel, concatenate, reshape, NDArray } from './core.mjs';

/**
 * @param {NDArray} a
 * @param {number[]} new_shape
 * @returns {NDArray}
 */
export function resize(a, new_shape) {
	if (typeof new_shape == 'number') new_shape = [new_shape];

	a = ravel(a);

	let new_size = 1;
	for (let dim of new_shape) {
		if (dim < 0) throw `all elements of 'new_shape' must be non-negative`;
		new_size *= dim;
	}

	if (a.size == 0 || new_size == 0) {
		return zeros(new_shape);
	}

	let repeats = Math.ceil(new_size / a.size);
	a = concatenate(Array(repeats).fill(a)).at(slice(0, new_size));

	return reshape(a, new_shape);
}

process.env.PRODUCTION ||
	tester
		.add(
			resize,
			() =>
				resize(
					array([
						[0, 1],
						[2, 3],
					]),
					[2, 3]
				),
			() =>
				array([
					[0, 1, 2],
					[3, 0, 1],
				])
		)
		.add(
			resize,
			() =>
				resize(
					array([
						[0, 1],
						[2, 3],
					]),
					[1, 4]
				),
			() => array([[0, 1, 2, 3]])
		)

		.add(
			resize,
			() =>
				resize(
					array([
						[0, 1],
						[2, 3],
					]),
					[2, 4]
				),
			() =>
				array([
					[0, 1, 2, 3],
					[0, 1, 2, 3],
				])
		);