22
30
| Ready
23
31
| Recovering of { rested : duration; recommended : duration }
24
32
25
-
Removed:
let evaluate_readiness ~now:_ ~last_workout:_ ~recommended:_ = failwith "TODO"
26
-
Removed:
let is_ready _ = failwith "TODO"
33
+
Added:
let evaluate_readiness ~now ~last_workout ~recommended =
34
+
Added:
let rested = now - last_workout in
35
+
Added:
if rested >= recommended then Ready else Recovering { rested; recommended }
27
36
37
+
Added:
let is_ready = function Ready -> true | Recovering _ -> false
38
+
Added:
28
39
type override_reason = { note : string; readiness_at_start : readiness }
29
-
Removed:
type session = unit
40
+
Added:
41
+
Added:
type session = {
42
+
Added:
started_at : timestamp;
43
+
Added:
ended_at : timestamp option;
44
+
Added:
overridden_recovery : override_reason option;
45
+
Added:
}
46
+
Added:
30
47
type error = Not_recovered of { readiness : readiness }
31
48
32
-
Removed:
let start_session _ ~last_workout:_ ~recommended:_ = failwith "TODO"
49
+
Added:
let readiness_now (module Clock : CLOCK) ~last_workout ~recommended =
50
+
Added:
match last_workout with
51
+
Added:
| None -> Ready
52
+
Added:
| Some last ->
53
+
Added:
evaluate_readiness ~now:(Clock.now ()) ~last_workout:last ~recommended
33
54
34
-
Removed:
let start_session_overriding_recovery _ ~last_workout:_ ~recommended:_
35
-
Removed:
~acknowledged:_ =
36
-
Removed:
failwith "TODO"
55
+
Added:
let start_session clock ~last_workout ~recommended =
56
+
Added:
let readiness = readiness_now clock ~last_workout ~recommended in
57
+
Added:
if is_ready readiness then
58
+
Added:
let (module Clock) = clock in
59
+
Added:
Ok
60
+
Added:
{ started_at = Clock.now (); ended_at = None; overridden_recovery = None }
61
+
Added:
else Error (Not_recovered { readiness })
37
62
38
-
Removed:
let end_session _ _ = failwith "TODO"
39
-
Removed:
let started_at _ = failwith "TODO"
40
-
Removed:
let ended_at _ = failwith "TODO"
41
-
Removed:
let session_duration _ = failwith "TODO"
42
-
Removed:
let overridden_recovery _ = failwith "TODO"
43
-
Removed:
let pp_session _ _ = failwith "TODO"
63
+
Added:
let start_session_overriding_recovery clock ~last_workout ~recommended
64
+
Added:
~acknowledged =
65
+
Added:
let readiness_at_start = readiness_now clock ~last_workout ~recommended in
66
+
Added:
let (module Clock) = clock in
67
+
Added:
{
68
+
Added:
started_at = Clock.now ();
69
+
Added:
ended_at = None;
70
+
Added:
overridden_recovery = Some { note = acknowledged; readiness_at_start };
71
+
Added:
}
72
+
Added:
73
+
Added:
let end_session (module Clock : CLOCK) session =
74
+
Added:
{ session with ended_at = Some (Clock.now ()) }
75
+
Added:
76
+
Added:
let started_at session = session.started_at
77
+
Added:
let ended_at session = session.ended_at
78
+
Added:
79
+
Added:
let session_duration session =
80
+
Added:
Option.map (fun ended -> ended - session.started_at) session.ended_at
81
+
Added:
82
+
Added:
let overridden_recovery session = session.overridden_recovery
83
+
Added:
84
+
Added:
let pp_session fmt session =
85
+
Added:
match session.ended_at with
86
+
Added:
| None -> Format.fprintf fmt "started at %d" session.started_at
87
+
Added:
| Some ended ->
88
+
Added:
Format.fprintf fmt "started at %d, ended at %d" session.started_at ended