Skip to content

Commit 495195c

Browse files
committed
tidying up
1 parent 8b7a91d commit 495195c

File tree

10 files changed

+97
-87
lines changed

10 files changed

+97
-87
lines changed

bench_test.go

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package multielo
22

33
import (
44
"testing"
5+
"time"
56
)
67

78
func setupLeagueForBenchmark(playerCount int) (*League, []*MatchResult) {
@@ -30,7 +31,7 @@ func BenchmarkAddMatchSmall(b *testing.B) {
3031
b.ReportAllocs()
3132
b.ResetTimer()
3233
for i := 0; i < b.N; i++ {
33-
if err := l.AddMatch(results); err != nil {
34+
if err := l.AddMatch(results, time.Now()); err != nil {
3435
b.Fatalf("add match failed: %v", err)
3536
}
3637
if i%1000 == 0 {
@@ -45,7 +46,7 @@ func BenchmarkAddMatchMedium(b *testing.B) {
4546
b.ReportAllocs()
4647
b.ResetTimer()
4748
for i := 0; i < b.N; i++ {
48-
if err := l.AddMatch(results); err != nil {
49+
if err := l.AddMatch(results, time.Now()); err != nil {
4950
b.Fatalf("add match failed: %v", err)
5051
}
5152
if i%1000 == 0 {
@@ -60,7 +61,7 @@ func BenchmarkAddMatchLarge(b *testing.B) {
6061
b.ReportAllocs()
6162
b.ResetTimer()
6263
for i := 0; i < b.N; i++ {
63-
if err := l.AddMatch(results); err != nil {
64+
if err := l.AddMatch(results, time.Now()); err != nil {
6465
b.Fatalf("add match failed: %v", err)
6566
}
6667
if i%100 == 0 {
@@ -90,7 +91,7 @@ func BenchmarkGetLeaderboard(b *testing.B) {
9091

9192
// Add some matches to populate the league
9293
for i := 0; i < 10; i++ {
93-
_ = l.AddMatch(results)
94+
_ = l.AddMatch(results, time.Now())
9495
}
9596

9697
b.ReportAllocs()
@@ -106,7 +107,7 @@ func BenchmarkGetPlayerStats(b *testing.B) {
106107

107108
// Add some matches to build up stats
108109
for i := 0; i < 50; i++ {
109-
_ = l.AddMatch(results)
110+
_ = l.AddMatch(results, time.Now())
110111
}
111112

112113
player, _ := l.GetPlayer("Aa")
@@ -162,7 +163,7 @@ func BenchmarkMatchFiltering(b *testing.B) {
162163

163164
// Add many matches
164165
for i := 0; i < 100; i++ {
165-
_ = l.AddMatch(results)
166+
_ = l.AddMatch(results, time.Now())
166167
}
167168

168169
filter := MatchFilter{

domain/graph.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func SetGraphRenderer(r GraphRenderer) {
3232
}
3333

3434
func (l *League) GenerateGraph() (string, error) {
35-
return l.GenerateGraphWithFilename("elo")
35+
return l.GenerateGraphWithFilename("index")
3636
}
3737

3838
func (l *League) GenerateGraphWithFilename(filenamePrefix string) (string, error) {

domain/league.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func (l *League) GetLeaderboard() []*Player {
218218
return result
219219
}
220220

221-
func (l *League) AddMatch(results []*MatchResult) error {
221+
func (l *League) AddMatch(results []*MatchResult, date time.Time) error {
222222
l.mu.Lock()
223223
defer l.mu.Unlock()
224224
if err := l.validator.ValidateMatchResults(results); err != nil {

domain/multileague.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package domain
33
import (
44
"context"
55
"sync"
6+
"time"
67
)
78

89
type MultiLeagueService struct {
@@ -87,12 +88,12 @@ func (m *MultiLeagueService) AddPlayer(ctx context.Context, leagueID, playerName
8788
return league.AddPlayer(playerName)
8889
}
8990

90-
func (m *MultiLeagueService) RecordMatch(ctx context.Context, leagueID string, results []*MatchResult) error {
91+
func (m *MultiLeagueService) RecordMatch(ctx context.Context, leagueID string, results []*MatchResult, date time.Time) error {
9192
league, err := m.GetLeague(ctx, leagueID)
9293
if err != nil {
9394
return err
9495
}
95-
return league.AddMatch(results)
96+
return league.AddMatch(results, date)
9697
}
9798

9899
func (m *MultiLeagueService) GetLeaderboard(ctx context.Context, leagueID string) ([]*Player, error) {

domain/service.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package domain
22

3+
import "time"
4+
35
type LeagueCommands interface {
46
AddPlayer(name string) error
57
RemovePlayer(name string) error
@@ -29,12 +31,14 @@ func NewLeagueService(league *League) *LeagueService {
2931
return &LeagueService{league: league}
3032
}
3133

32-
func (s *LeagueService) AddPlayer(name string) error { return s.league.AddPlayer(name) }
33-
func (s *LeagueService) RemovePlayer(name string) error { return s.league.RemovePlayer(name) }
34-
func (s *LeagueService) RecordMatch(results []*MatchResult) error { return s.league.AddMatch(results) }
35-
func (s *LeagueService) Reset() { s.league.Reset() }
36-
func (s *LeagueService) ResetPlayers() { s.league.ResetPlayers() }
37-
func (s *LeagueService) ResetMatches() { s.league.ResetMatches() }
34+
func (s *LeagueService) AddPlayer(name string) error { return s.league.AddPlayer(name) }
35+
func (s *LeagueService) RemovePlayer(name string) error { return s.league.RemovePlayer(name) }
36+
func (s *LeagueService) RecordMatch(results []*MatchResult, date time.Time) error {
37+
return s.league.AddMatch(results, date)
38+
}
39+
func (s *LeagueService) Reset() { s.league.Reset() }
40+
func (s *LeagueService) ResetPlayers() { s.league.ResetPlayers() }
41+
func (s *LeagueService) ResetMatches() { s.league.ResetMatches() }
3842

3943
func (s *LeagueService) Player(name string) (*Player, error) { return s.league.GetPlayer(name) }
4044
func (s *LeagueService) Players() []*Player { return s.league.GetPlayers() }

infrastructure/html_graph_renderer.go

Lines changed: 37 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ func NewHTMLGraphRenderer() domain.GraphRenderer {
1818

1919
var htmlColors = []string{
2020
"#FF0000", "#0000FF", "#00AA00", "#FF8800", "#FF00FF",
21-
"#00FFFF", "#FFFF00", "#AA0000", "#0000AA", "#00AA99",
21+
"#00FFFF", "#FFFF00", "#0000AA", "#00AA99",
2222
"#FF00AA", "#AAFF00", "#FF6600", "#0066FF", "#00FF66",
2323
"#FF0066", "#6600FF", "#66FF00", "#0066AA", "#AA6600",
2424
}
@@ -115,8 +115,6 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
115115

116116
segX := fmt.Sprintf("%d, %d", prevIndex, raceIndex)
117117
segY := fmt.Sprintf("%d, %d", elos[prevIndex], elos[raceIndex])
118-
// Compute delta for this segment
119-
delta := elos[raceIndex] - elos[prevIndex]
120118

121119
// Build trace; show hover only for decay segments
122120
var trace string
@@ -130,25 +128,24 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
130128
type: 'scatter',
131129
mode: 'lines',
132130
line: { color: %q, width: 2, dash: %q },
133-
hoverinfo: 'skip',
134131
opacity: %.2f,
135-
hovertemplate: '<b>%s</b><br>Rating: %%{y}<extra></extra>',
132+
hoverinfo: 'skip',
136133
visible: true
137-
}`, fmt.Sprintf("%s (%d)", player.Name, player.ELO), player.Name, showLegend, segX, segY, color, dash, opacity, player.Name)
134+
}`, fmt.Sprintf("%s (%d)", player.Name, player.ELO), player.Name, showLegend, segX, segY, color, dash, opacity)
138135
} else {
139136
trace = fmt.Sprintf(`{
140-
name: %q,
141-
legendgroup: %q,
142-
showlegend: %t,
143-
x: [%s],
144-
y: [%s],
145-
type: 'scatter',
146-
mode: 'lines',
147-
line: { color: %q, width: 2, dash: %q },
148-
opacity: %.2f,
149-
hovertemplate: '<b>%s</b><br>Rating: %%{y}<br>Decay: %+d<extra></extra>',
150-
visible: true
151-
}`, fmt.Sprintf("%s (%d)", player.Name, player.ELO), player.Name, showLegend, segX, segY, color, dash, opacity, player.Name, delta)
137+
name: %q,
138+
legendgroup: %q,
139+
showlegend: %t,
140+
x: [%s],
141+
y: [%s],
142+
type: 'scatter',
143+
mode: 'lines',
144+
line: { color: '#AA0000', width: 2, dash: %q },
145+
opacity: %.2f,
146+
hoverinfo: 'skip',
147+
visible: true
148+
}`, fmt.Sprintf("%s (%d)", player.Name, player.ELO), player.Name, showLegend, segX, segY, dash, opacity)
152149
}
153150
traces = append(traces, trace)
154151

@@ -160,25 +157,29 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
160157
}
161158

162159
// Add circle markers only at attended races (no markers for missed)
163-
var attendedX []string
164-
var attendedY []string
165-
var attendedText []string
160+
var raceX []string
161+
var raceY []string
162+
var markerText []string
163+
missed := 0
166164
for raceIndex := 1; raceIndex < len(elos); raceIndex++ {
165+
raceX = append(raceX, fmt.Sprintf("%d", raceIndex))
166+
raceY = append(raceY, fmt.Sprintf("%d", elos[raceIndex]))
167+
delta := elos[raceIndex] - elos[raceIndex-1]
168+
pos := positions[player.Name][raceIndex-1]
169+
167170
if playerRaces[raceIndex-1] {
168-
attendedX = append(attendedX, fmt.Sprintf("%d", raceIndex))
169-
attendedY = append(attendedY, fmt.Sprintf("%d", elos[raceIndex]))
170-
delta := elos[raceIndex] - elos[raceIndex-1]
171-
pos := positions[player.Name][raceIndex-1]
172-
attendedText = append(attendedText, fmt.Sprintf("Position: %d | Δ %+d", pos, delta))
171+
markerText = append(markerText, fmt.Sprintf("Position: %d | Δ %+d", pos, delta))
172+
} else {
173+
missed += 1
174+
markerText = append(markerText, fmt.Sprintf("Missed: %d | Δ %+d", missed, delta))
173175
}
174176
}
175-
if len(attendedX) > 0 {
176-
// Quote text entries to produce a valid JS array of strings
177-
quoted := make([]string, len(attendedText))
178-
for i, t := range attendedText {
179-
quoted[i] = fmt.Sprintf("%q", t)
180-
}
181-
markerTrace := fmt.Sprintf(`{
177+
// Quote text entries to produce a valid JS array of strings
178+
quoted := make([]string, len(markerText))
179+
for i, t := range markerText {
180+
quoted[i] = fmt.Sprintf("%q", t)
181+
}
182+
markerTrace := fmt.Sprintf(`{
182183
name: %q,
183184
legendgroup: %q,
184185
showlegend: false,
@@ -188,11 +189,10 @@ func generateHTML(players []domain.GraphPlayer, history map[string][]int, partic
188189
mode: 'markers',
189190
marker: { color: %q, size: 6, symbol: 'circle' },
190191
text: [%s],
191-
hovertemplate: '<b>%s</b><br>Rating: %%{y}<br>%s<extra></extra>',
192+
hovertemplate: '<b>%s</b><br>Rating: %%{y}<br>%s<extra></extra>',
192193
visible: true
193-
}`, fmt.Sprintf("%s markers", player.Name), player.Name, strings.Join(attendedX, ", "), strings.Join(attendedY, ", "), color, strings.Join(quoted, ", "), player.Name, "%{text}")
194-
traces = append(traces, markerTrace)
195-
}
194+
}`, fmt.Sprintf("%s markers", player.Name), player.Name, strings.Join(raceX, ", "), strings.Join(raceY, ", "), color, strings.Join(quoted, ", "), player.Name, "%{text}")
195+
traces = append(traces, markerTrace)
196196
}
197197

198198
html := fmt.Sprintf(`<!DOCTYPE html>

0 commit comments

Comments
 (0)