diff options
author | Joris | 2020-02-16 22:45:07 +0100 |
---|---|---|
committer | Joris | 2020-02-17 09:15:11 +0100 |
commit | 25afb0bde9b8a2c064135a534231c232a461b341 (patch) | |
tree | 5ab25640024238a2f6f2d176e5870178f18b5345 /src/step.ml | |
parent | 0366f8cd49d2db40ea5efc639f6a475ecd97675e (diff) | |
download | tabata-25afb0bde9b8a2c064135a534231c232a461b341.tar.gz tabata-25afb0bde9b8a2c064135a534231c232a461b341.tar.bz2 tabata-25afb0bde9b8a2c064135a534231c232a461b341.zip |
Set up a first version of tabata timer
Diffstat (limited to 'src/step.ml')
-rw-r--r-- | src/step.ml | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/step.ml b/src/step.ml new file mode 100644 index 0000000..02a110e --- /dev/null +++ b/src/step.ml @@ -0,0 +1,40 @@ +type step = Prepare | Work | Rest | End + +let prettyPrint step = + match step with + | Prepare -> "Prepare" + | Work -> "Work" + | Rest -> "Rest" + | End -> "End" + +type state = { step : step; remaining : int; tabata : int; cycle : int } + +let getAt (config : Config.config) elapsed = + let cycleDuration = config.work + config.rest in + let tabataDuration = config.prepare + (config.cycles * cycleDuration) in + if elapsed >= tabataDuration * config.tabatas then + { + step = End; + remaining = 0; + tabata = config.tabatas; + cycle = config.cycles; + } + else + let currentTabataElapsed = elapsed mod tabataDuration in + let step, remaining = + if currentTabataElapsed < config.prepare then + (Prepare, config.prepare - currentTabataElapsed) + else + let currentCycleElapsed = + (currentTabataElapsed - config.prepare) mod cycleDuration + in + if currentCycleElapsed < config.work then + (Work, config.work - currentCycleElapsed) + else (Rest, config.work + config.rest - currentCycleElapsed) + in + let tabata = (elapsed / tabataDuration) + 1 in + let cycle = + if currentTabataElapsed < config.prepare then 1 + else ((currentTabataElapsed - config.prepare) / cycleDuration) + 1 + in + { step; remaining; tabata; cycle } |