Files
gridpilot.gg/packages/racing/domain/services/StrengthOfFieldCalculator.ts
2025-12-08 23:52:36 +01:00

39 lines
1018 B
TypeScript

/**
* Domain Service: StrengthOfFieldCalculator
*
* Calculates the Strength of Field (SOF) for a race based on participant ratings.
* SOF is the average rating of all participants in a race.
*/
export interface DriverRating {
driverId: string;
rating: number;
}
export interface StrengthOfFieldCalculator {
/**
* Calculate SOF from a list of driver ratings
* Returns null if no valid ratings are provided
*/
calculate(driverRatings: DriverRating[]): number | null;
}
/**
* Default implementation using simple average
*/
export class AverageStrengthOfFieldCalculator implements StrengthOfFieldCalculator {
calculate(driverRatings: DriverRating[]): number | null {
if (driverRatings.length === 0) {
return null;
}
const validRatings = driverRatings.filter(dr => dr.rating > 0);
if (validRatings.length === 0) {
return null;
}
const sum = validRatings.reduce((acc, dr) => acc + dr.rating, 0);
return Math.round(sum / validRatings.length);
}
}