import type { GuardModel } from '$lib/types/leaderboard'; export function isNumber(value: unknown): value is number { return typeof value === 'number' && Number.isFinite(value); } export function average(values: (number | null)[]) { const present = values.filter(isNumber); if (!present.length) return null; return present.reduce((total, value) => total + value, 0) / present.length; } export function geometricMean(values: number[]) { const present = values.filter((value) => value > 0); if (!present.length) return null; const logSum = present.reduce((total, value) => total + Math.log(value), 0); return Math.exp(logSum / present.length); } export function sizeNumber(size: string) { const parsed = Number.parseFloat(size); return Number.isFinite(parsed) ? parsed : Number.NaN; } export function formatIsoDate(value: string, locale: string) { const date = new Date(`${value}T00:00:00.000Z`); if (Number.isNaN(date.getTime()) || date.toISOString().slice(0, 10) !== value) return value; return new Intl.DateTimeFormat(locale, { day: 'numeric', month: 'short', year: 'numeric', timeZone: 'UTC' }).format(date); } export function modelRepositoryUrl(model: GuardModel) { return model.hfUrl ?? `https://huggingface.co/${model.name}`; }