Skip to content

Commit

Permalink
add svgf-par@2.0.0 and restructure ijru models
Browse files Browse the repository at this point in the history
  • Loading branch information
swantzter committed Sep 1, 2023
1 parent a2cf4f2 commit 9a78cef
Show file tree
Hide file tree
Showing 32 changed files with 256 additions and 59 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import assert from 'node:assert'
import test from 'node:test'
import * as mod from './ijru.speed@3.0.0.js'
import * as mod from './ijru.speed@1.0.0.js'
import type { EntryMeta, EntryResult, JudgeMeta } from '../types.js'
import { RSRWrongJudgeTypeError } from '../../errors.js'

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -104,8 +104,8 @@ export const speedResultTableHeaders: TableDefinition = {
}

export default {
id: 'ijru.speed@3.0.0',
name: 'IJRU Speed v3.0.0',
id: 'ijru.speed@1.0.0',
name: 'IJRU Speed v1.0.0',
options: [
{ id: 'falseSwitches', name: 'False Switches', type: 'number' }
],
Expand Down
8 changes: 0 additions & 8 deletions lib/models/competition-events/ijru.speed@2.0.0.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ export const overallTableFactory: TableDefinitionGetter<Option, CompetitionEvent

for (const cEvt of [...srEvts, ...ddEvts]) {
evtGroup.push({
text: typeof cEvtOptions[cEvt].name === 'string' ? (cEvtOptions[cEvt].name as string).replace(/^(Double Dutch|Single Rope) /, '') : '',
text: typeof cEvtOptions[cEvt].name === 'string' ? (cEvtOptions[cEvt].name as string).replace(/^(Double Dutch|Single Rope) /, '') : cEvt.split('.')[4] ?? '',
key: cEvt,
colspan: 2
})
Expand Down Expand Up @@ -89,8 +89,8 @@ export const overallTableFactory: TableDefinitionGetter<Option, CompetitionEvent
}

export default {
id: 'ijru.overall@3.0.0',
name: 'IJRU Overall v3.0.0',
id: 'ijru.overall@1.0.0',
name: 'IJRU Overall v1.0.0',
options: [],
competitionEventOptions: [
{ id: 'name', name: 'Name', type: 'string' },
Expand Down
8 changes: 0 additions & 8 deletions lib/models/overalls/ijru.overall@2.0.0.ts

This file was deleted.

156 changes: 156 additions & 0 deletions lib/models/overalls/svgf-par.overall@2.0.0.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
import { roundTo, roundToCurry } from '../../helpers.js'
import { type CompetitionEventDefinition } from '../../preconfigured/types.js'
import { type TableHeaderGroup, type OverallModel, type TableDefinitionGetter, type TableHeader, type EntryResult } from '../types.js'

type Option = never
type CompetitionEventOptions = 'name' | 'rankMultiplier' | 'resultMultiplier' | 'normalisationMultiplier'

export const overallTableFactory: TableDefinitionGetter<Option, CompetitionEventOptions> = (options, cEvtOptions) => {
if (cEvtOptions == null) throw new TypeError('Missing competitionEventOptions argument')
const groups: TableHeaderGroup[][] = []
const cEvtDefs = Object.keys(cEvtOptions) as CompetitionEventDefinition[]

const srEvts = cEvtDefs.filter(cEvt => cEvt.split('.')[3] === 'sr')
const whEvts = cEvtDefs.filter(cEvt => cEvt.split('.')[3] === 'wh')

const disciplineGroup: TableHeaderGroup[] = []

if (srEvts.length) {
disciplineGroup.push({
text: 'Single Rope',
key: 'sr',
colspan: srEvts.length * 2
})
}

if (whEvts.length) {
disciplineGroup.push({
text: 'Wheel',
key: 'wh',
colspan: whEvts.length * 2
})
}

disciplineGroup.push({
text: 'Overall',
key: 'oa',
colspan: 3,
rowspan: 2
})

groups.push(disciplineGroup)

const evtGroup: TableHeaderGroup[] = []

for (const cEvt of [...srEvts, ...whEvts]) {
evtGroup.push({
text: typeof cEvtOptions[cEvt].name === 'string' ? (cEvtOptions[cEvt].name as string).replace(/^(Wheel|Single Rope) /, '') : cEvt.split('.')[4] ?? '',
key: cEvt,
colspan: 2
})
}

groups.push(evtGroup)

const headers: TableHeader[] = []

for (const cEvt of [...srEvts, ...whEvts]) {
headers.push({
text: 'Score',
key: 'R',
component: cEvt
}, {
text: 'Rank',
key: 'S',
component: cEvt,
color: 'red'
})
}

headers.push({
text: 'Normalised',
key: 'B',
color: 'gray',
formatter: roundToCurry(2)
}, {
text: 'Rank Sum',
key: 'T',
color: 'green'
}, {
text: 'Rank',
key: 'S',
color: 'red'
})

return {
groups,
headers
}
}

export default {
id: 'svgf-par.overall@2.0.0',
name: 'SvGF Pair Overall (IJRU-based) v2.0.0',
options: [],
competitionEventOptions: [
{ id: 'name', name: 'Name', type: 'string' },
{ id: 'rankMultiplier', name: 'Rank Multiplier', type: 'number' },
{ id: 'resultMultiplier', name: 'Result Multiplier', type: 'number' },
{ id: 'normalisationMultiplier', name: 'Normalisation Multiplier', type: 'number' }
],
resultTable: overallTableFactory,
rankOverall (results, options, competitionEventOptions) {
const components: Partial<Record<CompetitionEventDefinition, Readonly<EntryResult[]>>> = {}
const competitionEventIds: CompetitionEventDefinition[] = Object.keys(competitionEventOptions) as CompetitionEventDefinition[]

for (const cEvtDef of competitionEventIds) {
const ranked = results.filter(result => result.meta.competitionEvent === cEvtDef)
components[cEvtDef] = ranked
}

const participantIds = [...new Set(results.map(r => r.meta.participantId))]

const ranked = participantIds.map(participantId => {
const cRes = competitionEventIds
.map((cEvt) => components[cEvt]?.find(r => r.meta.participantId === participantId))
.filter(r => !!r) as EntryResult[]

const R = roundTo(cRes.reduce((acc, curr) =>
acc + (
(curr.result.R ?? 0) *
(Number.isInteger(competitionEventOptions[curr.meta.competitionEvent]?.resultMultiplier) ? competitionEventOptions[curr.meta.competitionEvent]?.resultMultiplier as number : 1)
)
, 0), 4)
const T = cRes.reduce((acc, curr) =>
acc + (
(curr.result.S ?? 0) *
(Number.isInteger(competitionEventOptions[curr.meta.competitionEvent]?.rankMultiplier) ? competitionEventOptions[curr.meta.competitionEvent]?.rankMultiplier as number : 1)
)
, 0)
const B = roundTo(cRes.reduce((acc, curr) =>
acc + (
(curr.result.N ?? 0) *
(Number.isInteger(competitionEventOptions[curr.meta.competitionEvent]?.normalisationMultiplier) ? competitionEventOptions[curr.meta.competitionEvent]?.normalisationMultiplier as number : 1)
)
, 0), 2)

return {
meta: { participantId },
result: { R, T, B, S: 0 },
componentResults: Object.fromEntries(cRes.map(r => [r.meta.competitionEvent, r])),
statuses: {}
}
})

ranked.sort((a, b) => {
if (a.result.T !== b.result.T) return a.result.T - b.result.T
return b.result.B - a.result.B
})

for (let idx = 0; idx < ranked.length; idx++) {
ranked[idx].result.S = ranked.findIndex(obj => obj.result.B === ranked[idx].result.B) + 1
}

return ranked
}
} satisfies OverallModel<Option, CompetitionEventOptions>
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 3
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 0
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 1
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 0
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 3
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 0
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruSpeed200 from '../../../../models/competition-events/ijru.speed@2.0.0.js'
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed200, {
export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 0
},
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@3.0.0.js'
import ijruSpeed300 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed300, {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 1
},
id: 'e.svgf.sp.sr.srpe.2.2x90@2.0.0',
name: 'Single Rope Pair Speed Endurance'
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
import ijruSpeed100 from '../../../../models/competition-events/ijru.speed@1.0.0.js'
import { partiallyConfigureCompetitionEventModel } from '../../../types.js'

export default partiallyConfigureCompetitionEventModel(ijruSpeed100, {
options: {
falseSwitches: 1
},
id: 'e.svgf.sp.sr.srps.2.2x30@2.0.0',
name: 'Single Rope Pair Speed'
})
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruOverall200 from '../../../../models/overalls/ijru.overall@2.0.0.js'
import ijruOverall100 from '../../../../models/overalls/ijru.overall@1.0.0.js'
import { partiallyConfigureOverallModel } from '../../../types.js'

export default partiallyConfigureOverallModel(ijruOverall200, {
export default partiallyConfigureOverallModel(ijruOverall100, {
options: {},
competitionEventOptions: {
'e.ijru.sp.dd.ddss.3.60': { name: 'Double Dutch Speed Sprint' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruOverall200 from '../../../../models/overalls/ijru.overall@2.0.0.js'
import ijruOverall100 from '../../../../models/overalls/ijru.overall@1.0.0.js'
import { partiallyConfigureOverallModel } from '../../../types.js'

export default partiallyConfigureOverallModel(ijruOverall200, {
export default partiallyConfigureOverallModel(ijruOverall100, {
options: {},
competitionEventOptions: {
'e.ijru.sp.sr.srss.1.30': { name: 'Single Rope Speed Sprint' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruOverall200 from '../../../../models/overalls/ijru.overall@2.0.0.js'
import ijruOverall100 from '../../../../models/overalls/ijru.overall@1.0.0.js'
import { partiallyConfigureOverallModel } from '../../../types.js'

export default partiallyConfigureOverallModel(ijruOverall200, {
export default partiallyConfigureOverallModel(ijruOverall100, {
options: {},
competitionEventOptions: {
'e.ijru.sp.sr.srdr.2.2x30': { name: 'Single Rope Double Unders Relay' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruOverall200 from '../../../../models/overalls/ijru.overall@2.0.0.js'
import ijruOverall100 from '../../../../models/overalls/ijru.overall@1.0.0.js'
import { partiallyConfigureOverallModel } from '../../../types.js'

export default partiallyConfigureOverallModel(ijruOverall200, {
export default partiallyConfigureOverallModel(ijruOverall100, {
options: {},
competitionEventOptions: {
'e.ijru.sp.sr.srdr.2.2x30': { name: 'Single Rope Double Unders Relay' },
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import ijruOverall300 from '../../../../models/overalls/ijru.overall@3.0.0.js'
import ijruOverall100 from '../../../../models/overalls/ijru.overall@1.0.0.js'
import { partiallyConfigureOverallModel } from '../../../types.js'

export default partiallyConfigureOverallModel(ijruOverall300, {
export default partiallyConfigureOverallModel(ijruOverall100, {
options: {},
competitionEventOptions: {
'e.ijru.sp.dd.ddss.3.60': { name: 'Double Dutch Speed Sprint' },
Expand Down
Loading

0 comments on commit 9a78cef

Please sign in to comment.