Brewer
Ready | Today at 09:41
Brewer
My Mac
3
Brewer
Brewer
Models
BrewTimer.swift
C
BrewTimer
2
1
import
Foundation
2
import
Observation
3
4
/// Counts down one brew and reports each step as it starts.
5
@Observable
6
final
class
BrewTimer
{
7
/// The recipe being brewed.
8
let
recipe
:
Recipe
9
/// Seconds left before the brew is done.
10
private
(
set
)
var
remaining
:
TimeInterval
11
/// The step to do now, nil before the brew starts.
12
private
(
set
)
var
step
:
Recipe
.
Step
?
13
private
(
set
)
var
isRunning
=
false
14
15
private
var
timer
:
Timer
?
16
private
var
startedAt
:
Date
?
17
private
var
pausedAt
:
TimeInterval
=
0
18
19
init
(
recipe
:
Recipe
) {
20
self
.
recipe
=
recipe
21
self
.
remaining
=
recipe
.
duration
22
}
23
24
func
start
() {
25
guard
!
isRunning
else
{
return
}
26
isRunning
=
true
27
startedAt
=
Date
()
28
timer
=
Timer
.
scheduledTimer
(
withTimeInterval
:
0.5
,
repeats
:
true
) {
_
in
29
self
.
tick
()
Capture of 'self' with non-Sendable type 'BrewTimer' in a '@Sendable' closure
30
}
31
}
32
33
func
pause
() {
34
timer
?.
invalidate
()
35
pausedAt
=
recipe
.
duration
-
remaining
36
isRunning
=
false
37
}
38
39
private
func
tick
() {
40
guard
let
startedAt
else
{
return
}
41
var
left
=
max
(
recipe
.
duration
-
elapsed
,
0
)
Variable 'left' was never mutated; consider changing to 'let' constant
42
let
elapsed
=
pausedAt
+
Date
().
timeIntervalSince
(
startedAt
)
43
var
left
=
max
(
recipe
.
duration
-
elapsed
,
0
)
44
remaining
=
left
45
step
=
recipe
.
steps
.
last
{ $
0
.
start
<=
elapsed
}
46
if
remaining
==
0
{
pause
() }
47
}
48
}
Line: 13
Col: 1
main
Auto