@alexaegis/advent-of-code-lib
Version:
Advent of Code Library
93 lines (92 loc) • 3.36 kB
JavaScript
;
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;