UNPKG

@alexaegis/advent-of-code-lib

Version:
93 lines (92 loc) 3.36 kB
"use strict"; const node_perf_hooks = require("node:perf_hooks"); require("@alexaegis/common"); require("./array.polyfill-uI4B25o5.cjs"); const roundToDecimal_function = require("./round-to-decimal.function-O5Uesn7H.cjs"); require("js-sdsl"); require("./index-ZPyfgNVR.cjs"); require("./map.cjs"); const promises = require("node:fs/promises"); const node_path = require("node:path"); const node_fs = require("node:fs"); const kolorist = require("kolorist"); require("./set.cjs"); const benchTask = async (runner, resources, logger) => { if (process.versions["bun"] === void 0) { const obs = new node_perf_hooks.PerformanceObserver((list) => { list.getEntries().forEach((entry) => { logger?.(`${entry.name}: ${roundToDecimal_function.roundToDecimal(entry.duration, 2)} ms`); }); }); obs.observe({ entryTypes: ["measure"], buffered: true }); } node_perf_hooks.performance.mark("runstart"); const result = await runner(resources.input, resources.args); node_perf_hooks.performance.mark("runend"); node_perf_hooks.performance.measure("run", "runstart", "runend"); return result; }; const findNearestDirectoryNamed = (directoryName, cwd = process.cwd(), collection = []) => { const path = node_path.normalize(cwd); if (node_fs.existsSync(node_path.join(path, directoryName))) { return path; } const parentPath = node_path.join(path, ".."); return parentPath === path ? void 0 : findNearestDirectoryNamed(directoryName, parentPath, collection); }; const loadTaskResources = async (taskMetadata, file = "input.txt") => { const resourcesRoot = findNearestDirectoryNamed("resources"); if (!resourcesRoot) { throw new Error("resource directory not found"); } const baseUrl = node_path.join( resourcesRoot, "resources", taskMetadata.year.toString(), taskMetadata.day.toString().padStart(2, "0") ); const [input, args] = await Promise.all([ promises.readFile(node_path.join(baseUrl, file), { encoding: "utf8" }), // TODO: redo with @aa/node-common (strip extension and replace) promises.readFile(node_path.join(baseUrl, `${file.split(/(.*)\..*/)[1]}.args.json`), { encoding: "utf8" }).catch(() => void 0) ]); return { input, args: args ? JSON.parse(args) : void 0 }; }; const createLogger = (metadata) => (message) => { console.log( kolorist.white(kolorist.bgGreen(`[aoc:${metadata.year}-${metadata.day.toString().padStart(2, "0")}]`)), message ); }; const isTaskMetadata = (o) => Object.hasOwn(o, "year") && Object.hasOwn(o, "day"); const task = async (solution, taskMetadata, resourcesOverride) => { if (process.env["RUN"]) { const log = createLogger(taskMetadata); log("starting..."); let resources = typeof resourcesOverride === "object" ? resourcesOverride : await loadTaskResources( taskMetadata, resourcesOverride ); if (process.env["RESOURCE"]) { resources = await loadTaskResources( taskMetadata, process.env["RESOURCE"] ); } const result = await benchTask(solution, resources, log); log(`result: ${String(result)}`); return result; } else { return void 0; } }; exports.benchTask = benchTask; exports.createLogger = createLogger; exports.isTaskMetadata = isTaskMetadata; exports.loadTaskResources = loadTaskResources; exports.task = task;