import * as fs from "fs";
import * as readline from "readline";
import * as util from "util";

export async function LoadInput(dayNumber: number): Promise<string[]> {
	const contents = [];
	const stream = fs.createReadStream(`./inputs/${dayNumber}.txt`, "utf8");

	const rl = readline.createInterface({
		input: stream,
		crlfDelay: Infinity,
	});

	for await (const line of rl) {
		contents.push(line);
	}

	return contents;
}

/**
 * Inspect a variable in the console
 *
 * @param {any} value A value to inspect
 */
export function Inspect(value: any): void {
	console.log(util.inspect(value, { breakLength: Infinity, colors: true, depth: 256 }));
}

/**
 * Deep clone any input
 *
 * @param {any} value A value to clone
 * @returns A clone of the input
 */
export function DeepClone(value: any): any {
	return JSON.parse(JSON.stringify(value));
}

/**
 * Extracts all numbers from a string
 *
 * If there were no numbers in the string, then an empty array is returned.
 *
 * Numbers in the output are in the order they appeared in in the input
 *
 * @param {string} str A string
 * @returns {number[]} An array of numbers
 */
export function ExtractNumbers(str: string): number[] {
	return str.split(/\D/).filter((n) => n.length).map((n) => Number(n));
}