age-grade-tables
Version:
Age grading tables for races like Ironman in compact array format
79 lines • 3.01 kB
JavaScript
;
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