|
@@ -400,70 +400,38 @@ class YearlyHrvReport implements HrvPeriodReport { |
|
@@ -400,70 +400,38 @@ class YearlyHrvReport implements HrvPeriodReport { |
|
400
|
];
|
400
|
];
|
|
401
|
|
401
|
|
|
402
|
({List<int> mostStressed, List<int> leastStressed}) stressExtremeMonths() {
|
402
|
({List<int> mostStressed, List<int> leastStressed}) stressExtremeMonths() {
|
|
403
|
- final values = [
|
|
|
|
404
|
- for (final month in monthsWithLevel)
|
|
|
|
405
|
- if (levelForMonth(month) case final level?) MapEntry(month, level),
|
|
|
|
406
|
- ];
|
|
|
|
407
|
- values.sort(_compareByStressDescending);
|
|
|
|
408
|
-
|
|
|
|
409
|
- final mostStressed = <int>[];
|
|
|
|
410
|
- final leastStressed = <int>[];
|
|
|
|
411
|
- if (values.isEmpty) {
|
|
|
|
412
|
- return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
413
|
- }
|
|
|
|
414
|
-
|
|
|
|
415
|
- if (values.length == 1) {
|
|
|
|
416
|
- final entry = values.single;
|
|
|
|
417
|
- if (_isStressedLevel(entry.value)) {
|
|
|
|
418
|
- mostStressed.add(entry.key);
|
|
|
|
419
|
- } else {
|
|
|
|
420
|
- leastStressed.add(entry.key);
|
|
|
|
421
|
- }
|
|
|
|
422
|
- return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
423
|
- }
|
|
|
|
424
|
-
|
|
|
|
425
|
- mostStressed.add(values.first.key);
|
|
|
|
426
|
- leastStressed.add(values.last.key);
|
|
|
|
427
|
-
|
|
|
|
428
|
- if (values.length == 3) {
|
|
|
|
429
|
- final middle = values[1];
|
|
|
|
430
|
- if (_isStressedLevel(middle.value)) {
|
|
|
|
431
|
- mostStressed.add(middle.key);
|
403
|
+ final stressedValues = <MapEntry<int, double>>[];
|
|
|
|
404
|
+ final relaxedValues = <MapEntry<int, double>>[];
|
|
|
|
405
|
+ for (var month = 1; month <= 12; month++) {
|
|
|
|
406
|
+ final average = averageForMonth(month);
|
|
|
|
407
|
+ final level = levelForMonth(month);
|
|
|
|
408
|
+ if (average == null || level == null) continue;
|
|
|
|
409
|
+ final entry = MapEntry(month, average);
|
|
|
|
410
|
+ if (level == HrvStressLevel.attention ||
|
|
|
|
411
|
+ level == HrvStressLevel.overload) {
|
|
|
|
412
|
+ stressedValues.add(entry);
|
|
432
|
} else {
|
413
|
} else {
|
|
433
|
- leastStressed.add(middle.key);
|
414
|
+ relaxedValues.add(entry);
|
|
434
|
}
|
415
|
}
|
|
435
|
- } else if (values.length >= 4) {
|
|
|
|
436
|
- mostStressed.add(values[1].key);
|
|
|
|
437
|
- leastStressed.add(values[values.length - 2].key);
|
|
|
|
438
|
}
|
416
|
}
|
|
439
|
|
417
|
|
|
440
|
- mostStressed.sort();
|
|
|
|
441
|
- leastStressed.sort();
|
|
|
|
442
|
- return (mostStressed: mostStressed, leastStressed: leastStressed);
|
|
|
|
443
|
- }
|
|
|
|
444
|
-
|
|
|
|
445
|
- int _compareByStressDescending(
|
|
|
|
446
|
- MapEntry<int, HrvStressLevel> a,
|
|
|
|
447
|
- MapEntry<int, HrvStressLevel> b,
|
|
|
|
448
|
- ) {
|
|
|
|
449
|
- final valueComparison = _stressRank(b.value).compareTo(
|
|
|
|
450
|
- _stressRank(a.value),
|
418
|
+ return (
|
|
|
|
419
|
+ mostStressed: _selectMonthsByHrv(stressedValues, lowestFirst: true),
|
|
|
|
420
|
+ leastStressed: _selectMonthsByHrv(relaxedValues, lowestFirst: false),
|
|
451
|
);
|
421
|
);
|
|
452
|
- return valueComparison == 0 ? a.key.compareTo(b.key) : valueComparison;
|
|
|
|
453
|
- }
|
|
|
|
454
|
-
|
|
|
|
455
|
- bool _isStressedLevel(HrvStressLevel level) {
|
|
|
|
456
|
- return level == HrvStressLevel.attention ||
|
|
|
|
457
|
- level == HrvStressLevel.overload;
|
|
|
|
458
|
}
|
422
|
}
|
|
459
|
|
423
|
|
|
460
|
- int _stressRank(HrvStressLevel level) {
|
|
|
|
461
|
- return switch (level) {
|
|
|
|
462
|
- HrvStressLevel.overload => 3,
|
|
|
|
463
|
- HrvStressLevel.attention => 2,
|
|
|
|
464
|
- HrvStressLevel.normal => 1,
|
|
|
|
465
|
- HrvStressLevel.excellent => 0,
|
|
|
|
466
|
- };
|
424
|
+ List<int> _selectMonthsByHrv(
|
|
|
|
425
|
+ List<MapEntry<int, double>> values, {
|
|
|
|
426
|
+ required bool lowestFirst,
|
|
|
|
427
|
+ }) {
|
|
|
|
428
|
+ values.sort((a, b) {
|
|
|
|
429
|
+ final valueComparison = lowestFirst
|
|
|
|
430
|
+ ? a.value.compareTo(b.value)
|
|
|
|
431
|
+ : b.value.compareTo(a.value);
|
|
|
|
432
|
+ return valueComparison == 0 ? a.key.compareTo(b.key) : valueComparison;
|
|
|
|
433
|
+ });
|
|
|
|
434
|
+ return values.take(2).map((entry) => entry.key).toList()..sort();
|
|
467
|
}
|
435
|
}
|
|
468
|
|
436
|
|
|
469
|
List<int> monthsAtExtreme({required bool maximum}) {
|
437
|
List<int> monthsAtExtreme({required bool maximum}) {
|