Source: s_.mjs

import { tester, arange, array, slice, Slice } from './core.mjs';

let _index_exp = arg => {
	if (typeof arg == 'number') return arg;
	if (arg instanceof Slice) return arg;
	return slice(arg);
};

export const tupleType = Symbol('tupleType');

/**
 * @param  {...null|number|Slice|string} args
 * @returns {Array<null|number|Slice|string>}
 */
export function index_exp(...args) {
	let tup = args.map(_index_exp);
	tup[tupleType] = true;
	return tup;
}

/**
 * @param  {...null|number|Slice|string|Array<null|number|Slice|string>} args
 * @returns {Array<null|number|Slice|string>}
 */
export function s_(...args) {
	if (args.length == 1) {
		return _index_exp(args[0]);
	}
	return index_exp(...args);
}

process.env.PRODUCTION ||
	tester.add(
		s_,
		() =>
			arange(8)
				.reshape(2, 2, -1)
				.get(s_(0, [0, -1], '::-1')),
		() => array([[1, 0]])
	);