2026-05-31 16:23:46 +02:00
|
|
|
/// Result of a single set during a workout session.
|
|
|
|
|
library;
|
|
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Immutable result of one set, recording target vs actual reps.
|
2026-05-31 16:23:46 +02:00
|
|
|
class SetResult {
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Creates a set result.
|
2026-05-31 16:23:46 +02:00
|
|
|
const SetResult({
|
|
|
|
|
required this.targetReps,
|
|
|
|
|
required this.doneReps,
|
|
|
|
|
required this.weight,
|
|
|
|
|
});
|
|
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Deserializes a set result from a JSON map.
|
|
|
|
|
factory SetResult.fromJson(Map<String, dynamic> json) => SetResult(
|
|
|
|
|
targetReps: json['targetReps'] as int,
|
|
|
|
|
doneReps: json['doneReps'] as int,
|
|
|
|
|
weight: (json['weight'] as num).toDouble(),
|
|
|
|
|
);
|
|
|
|
|
|
|
|
|
|
/// Target number of reps for this set.
|
2026-05-31 16:23:46 +02:00
|
|
|
final int targetReps;
|
|
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Reps actually completed (may be less than [targetReps] on failure).
|
2026-05-31 16:23:46 +02:00
|
|
|
final int doneReps;
|
|
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Weight used for this set in kg.
|
2026-05-31 16:23:46 +02:00
|
|
|
final double weight;
|
|
|
|
|
|
|
|
|
|
/// True when the user completed every target rep.
|
|
|
|
|
bool get succeeded => doneReps >= targetReps;
|
|
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Returns a copy with [doneReps] replaced.
|
2026-05-31 16:23:46 +02:00
|
|
|
SetResult copyWith({int? doneReps}) => SetResult(
|
2026-06-28 08:11:43 +02:00
|
|
|
targetReps: targetReps,
|
|
|
|
|
doneReps: doneReps ?? this.doneReps,
|
|
|
|
|
weight: weight,
|
|
|
|
|
);
|
2026-05-31 16:23:46 +02:00
|
|
|
|
2026-06-28 08:11:43 +02:00
|
|
|
/// Serializes this set result to a JSON map.
|
2026-05-31 16:23:46 +02:00
|
|
|
Map<String, dynamic> toJson() => {
|
2026-06-28 08:11:43 +02:00
|
|
|
'targetReps': targetReps,
|
|
|
|
|
'doneReps': doneReps,
|
|
|
|
|
'weight': weight,
|
|
|
|
|
'succeeded': succeeded,
|
|
|
|
|
};
|
2026-05-31 16:23:46 +02:00
|
|
|
}
|