aboutsummaryrefslogtreecommitdiff
path: root/src/state.ts
blob: a0348f0e850b9fccd30afb3d87fb514fdb1f0908 (plain)
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()}`
  }
}