|
...
|
...
|
@@ -400,70 +400,38 @@ class YearlyHrvReport implements HrvPeriodReport { |
|
|
|
];
|
|
|
|
|
|
|
|
({List<int> mostStressed, List<int> leastStressed}) stressExtremeMonths() {
|
|
|
|
final values = [
|
|
|
|
for (final month in monthsWithLevel)
|
|
|
|
if (levelForMonth(month) case final level?) MapEntry(month, level),
|
|
|
|
];
|
|
|
|
values.sort(_compareByStressDescending);
|
|
|
|
|
|
|
|
final mostStressed = <int>[];
|
|
|
|
final leastStressed = <int>[];
|
|
|
|
if (values.isEmpty) {
|
|
|
|
return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
}
|
|
|
|
|
|
|
|
if (values.length == 1) {
|
|
|
|
final entry = values.single;
|
|
|
|
if (_isStressedLevel(entry.value)) {
|
|
|
|
mostStressed.add(entry.key);
|
|
|
|
} else {
|
|
|
|
leastStressed.add(entry.key);
|
|
|
|
}
|
|
|
|
return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
}
|
|
|
|
|
|
|
|
mostStressed.add(values.first.key);
|
|
|
|
leastStressed.add(values.last.key);
|
|
|
|
|
|
|
|
if (values.length == 3) {
|
|
|
|
final middle = values[1];
|
|
|
|
if (_isStressedLevel(middle.value)) {
|
|
|
|
mostStressed.add(middle.key);
|
|
|
|
final stressedValues = <MapEntry<int, double>>[];
|
|
|
|
final relaxedValues = <MapEntry<int, double>>[];
|
|
|
|
for (var month = 1; month <= 12; month++) {
|
|
|
|
final average = averageForMonth(month);
|
|
|
|
final level = levelForMonth(month);
|
|
|
|
if (average == null || level == null) continue;
|
|
|
|
final entry = MapEntry(month, average);
|
|
|
|
if (level == HrvStressLevel.attention ||
|
|
|
|
level == HrvStressLevel.overload) {
|
|
|
|
stressedValues.add(entry);
|
|
|
|
} else {
|
|
|
|
leastStressed.add(middle.key);
|
|
|
|
relaxedValues.add(entry);
|
|
|
|
}
|
|
|
|
} else if (values.length >= 4) {
|
|
|
|
mostStressed.add(values[1].key);
|
|
|
|
leastStressed.add(values[values.length - 2].key);
|
|
|
|
}
|
|
|
|
|
|
|
|
mostStressed.sort();
|
|
|
|
leastStressed.sort();
|
|
|
|
return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
}
|
|
|
|
|
|
|
|
int _compareByStressDescending(
|
|
|
|
MapEntry<int, HrvStressLevel> a,
|
|
|
|
MapEntry<int, HrvStressLevel> b,
|
|
|
|
) {
|
|
|
|
final valueComparison = _stressRank(b.value).compareTo(
|
|
|
|
_stressRank(a.value),
|
|
|
|
return (
|
|
|
|
mostStressed: _selectMonthsByHrv(stressedValues, lowestFirst: true),
|
|
|
|
leastStressed: _selectMonthsByHrv(relaxedValues, lowestFirst: false),
|
|
|
|
);
|
|
|
|
return valueComparison == 0 ? a.key.compareTo(b.key) : valueComparison;
|
|
|
|
}
|
|
|
|
|
|
|
|
bool _isStressedLevel(HrvStressLevel level) {
|
|
|
|
return level == HrvStressLevel.attention ||
|
|
|
|
level == HrvStressLevel.overload;
|
|
|
|
}
|
|
|
|
|
|
|
|
int _stressRank(HrvStressLevel level) {
|
|
|
|
return switch (level) {
|
|
|
|
HrvStressLevel.overload => 3,
|
|
|
|
HrvStressLevel.attention => 2,
|
|
|
|
HrvStressLevel.normal => 1,
|
|
|
|
HrvStressLevel.excellent => 0,
|
|
|
|
};
|
|
|
|
List<int> _selectMonthsByHrv(
|
|
|
|
List<MapEntry<int, double>> values, {
|
|
|
|
required bool lowestFirst,
|
|
|
|
}) {
|
|
|
|
values.sort((a, b) {
|
|
|
|
final valueComparison = lowestFirst
|
|
|
|
? a.value.compareTo(b.value)
|
|
|
|
: b.value.compareTo(a.value);
|
|
|
|
return valueComparison == 0 ? a.key.compareTo(b.key) : valueComparison;
|
|
|
|
});
|
|
|
|
return values.take(2).map((entry) => entry.key).toList()..sort();
|
|
|
|
}
|
|
|
|
|
|
|
|
List<int> monthsAtExtreme({required bool maximum}) {
|
...
|
...
|
|