UNPKG

age-grade-tables

Version:

Age grading tables for races like Ironman in compact array format

79 lines 3.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.getFactorByAgeAndGender = getFactorByAgeAndGender; exports.createAgeGradeLookup = createAgeGradeLookup; exports.getFactorFromLookup = getFactorFromLookup; exports.processAthletesBulk = processAthletesBulk; /** * Get age grade factor for a specific age and gender * @param table - Age grade table in array format * @param gender - Athlete gender ('M' or 'F') * @param age - Athlete age * @returns Age grade factor or null if not found */ function getFactorByAgeAndGender(table, gender, age) { // Handle both array and object formats if (table.length > 0 && Array.isArray(table[0])) { // Array format: [gender, start, end, factor] const arrayTable = table; const entry = arrayTable.find(([g, start, end]) => g === gender && age >= start && age <= end); return entry ? entry[3] : null; } else { // Object format: {gender, start, end, factor} const objectTable = table; const entry = objectTable.find(({ gender: g, start, end }) => g === gender && age >= start && age <= end); return entry ? entry.factor : null; } } /** * Creates a fast lookup map for bulk age grade factor retrieval * @param table - Age grade table in array or object format * @returns Map with key format: "gender_age" -> factor */ function createAgeGradeLookup(table) { const lookup = new Map(); // Handle both array and object formats if (table.length > 0 && Array.isArray(table[0])) { // Array format const arrayTable = table; for (const [gender, startAge, endAge, factor] of arrayTable) { for (let age = startAge; age <= endAge; age++) { lookup.set(`${gender}_${age}`, factor); } } } else { // Object format const objectTable = table; for (const { gender, start: startAge, end: endAge, factor } of objectTable) { for (let age = startAge; age <= endAge; age++) { lookup.set(`${gender}_${age}`, factor); } } } return lookup; } /** * Get age grade factor for a single athlete using a pre-built lookup map * @param lookup - Pre-built lookup map from createAgeGradeLookup * @param gender - Athlete gender ('M' or 'F') * @param age - Athlete age * @returns Age grade factor or null if not found */ function getFactorFromLookup(lookup, gender, age) { return lookup.get(`${gender}_${age}`) || null; } /** * Process multiple athletes efficiently using a pre-built lookup map * @param lookup - Pre-built lookup map from createAgeGradeLookup * @param athletes - Array of athletes with age and gender * @returns Array of athletes with their age grade factors */ function processAthletesBulk(lookup, athletes) { return athletes.map(athlete => ({ ...athlete, factor: getFactorFromLookup(lookup, athlete.gender, athlete.age) })); } //# sourceMappingURL=helpers.js.map