pk_data.dart
1.36 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
/// PK results are supplied by the caller; missing scores are not a draw.
enum PkResult { win, loss, draw }
class PkPlayer {
const PkPlayer({
required this.name,
this.subtitle = '',
this.avatarUrl,
this.avatarAsset,
this.score,
this.steps,
this.calories,
this.standingHours,
this.winningDays,
});
final String name;
final String subtitle;
final String? avatarUrl;
final String? avatarAsset;
final int? score, steps, calories, winningDays;
final double? standingHours;
}
class PkDay {
const PkDay(this.leftScore, this.rightScore);
final int leftScore, rightScore;
double get leftFraction =>
leftScore + rightScore == 0 ? 0.5 : leftScore / (leftScore + rightScore);
}
class PkData {
const PkData({
required this.left,
required this.right,
required this.month,
this.days = const {},
});
final PkPlayer left, right;
final DateTime month;
/// Day of month -> result. Missing days render as unrecorded.
final Map<int, PkDay> days;
PkResult? get result => compare(left.score, right.score);
PkResult? get monthlyResult => compare(left.winningDays, right.winningDays);
static PkResult? compare(int? left, int? right) {
if (left == null || right == null) return null;
return left > right
? PkResult.win
: left < right
? PkResult.loss
: PkResult.draw;
}
}