1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
import * as Config from 'config'
export enum Step {
WarmUp,
Prepare,
Work,
Rest,
End,
}
export function prettyPrintStep(step: Step): string {
if (step === Step.WarmUp)
return 'Warm Up'
if (step === Step.Prepare)
return 'Prepare'
else if (step === Step.Work)
return 'Work'
else if (step === Step.Rest)
return 'Rest'
else
return 'End'
}
export interface State {
step: Step,
remaining: number,
info: string,
elapsed: number,
}
export function getAt(config: Config.Config, elapsed: number): State {
if (elapsed < config.warmup) {
return {
step: Step.WarmUp,
remaining: config.warmup - elapsed,
info: '',
elapsed
}
}
const tabataElapsed = elapsed - config.warmup
const cycleDuration = config.work + config.rest
const tabataDuration = config.prepare + (config.cycles * cycleDuration)
if (tabataElapsed >= tabataDuration * config.tabatas) {
return {
step: Step.End,
remaining: 0,
info: '',
elapsed
}
}
const currentTabataElapsed = tabataElapsed % tabataDuration
let step, remaining
if (currentTabataElapsed < config.prepare) {
step = Step.Prepare
remaining = config.prepare - currentTabataElapsed
} else {
const currentCycleElapsed = (currentTabataElapsed - config.prepare) % cycleDuration
if (currentCycleElapsed < config.work) {
step = Step.Work
remaining = config.work - currentCycleElapsed
} else {
step = Step.Rest
remaining = config.work + config.rest - currentCycleElapsed
}
}
const tabata = Math.floor(tabataElapsed / tabataDuration) + 1
const cycle =
currentTabataElapsed < config.prepare
? 1
: Math.floor((currentTabataElapsed - config.prepare) / cycleDuration) + 1
const info = stepCount(step, tabata, cycle)
return { step, remaining, info, elapsed }
}
function stepCount(step: Step, tabata: number, cycle: number): string {
if (step === Step.Work || step === Step.Rest) {
return `#${tabata.toString()}.${cycle.toString()}`
} else {
return `#${tabata.toString()}`
}
}
|