diff options
author | Andrew Cady <d@jerkface.net> | 2022-10-24 19:58:57 -0400 |
---|---|---|
committer | Andrew Cady <d@jerkface.net> | 2022-10-24 19:58:57 -0400 |
commit | faed266557e4a91a1b21dbb6ca980103fcbbb02a (patch) | |
tree | 278622a773706aa4185258db57dbdcfac1d68315 | |
parent | 5f536504393b216f1ee59ac38991c88e59dd511e (diff) |
add support for down sets
-rwxr-xr-x | repgoal.hs | 43 |
1 files changed, 22 insertions, 21 deletions
@@ -14,6 +14,7 @@ | |||
14 | {-# language OverloadedStrings #-} | 14 | {-# language OverloadedStrings #-} |
15 | {-# language DeriveGeneric #-} | 15 | {-# language DeriveGeneric #-} |
16 | {-# language DerivingVia #-} | 16 | {-# language DerivingVia #-} |
17 | {-# language TupleSections #-} | ||
17 | import Rebase.Prelude hiding (toList, on, (<+>), Max) | 18 | import Rebase.Prelude hiding (toList, on, (<+>), Max) |
18 | import qualified Rebase.Prelude as Prelude | 19 | import qualified Rebase.Prelude as Prelude |
19 | import qualified Data.Set as Set | 20 | import qualified Data.Set as Set |
@@ -138,33 +139,32 @@ makeLenses ''St | |||
138 | -- TODO: Event for inotify on edited text file (as input interface) | 139 | -- TODO: Event for inotify on edited text file (as input interface) |
139 | data CustomEvent = CustomEvent | 140 | data CustomEvent = CustomEvent |
140 | 141 | ||
141 | data SetScheme = SetScheme { ratioMax :: Rational, numberOfReps :: Integer } | 142 | data SetScheme = SetScheme { ratioMax :: Rational, numberOfReps :: Integer, amrap :: Bool } |
142 | 143 | ||
143 | setScheme :: Rational -> Integer -> SetScheme | 144 | setScheme :: Rational -> Integer -> SetScheme |
144 | setScheme percentage reps = SetScheme (percentage / 100) reps | 145 | setScheme percentage reps = SetScheme (percentage / 100) reps False |
146 | setSchemeAMRAP percentage reps = SetScheme (percentage / 100) reps True | ||
145 | 147 | ||
146 | data SetOption = Fresher | Heavier | 148 | data SetOption = Fresher | Heavier |
147 | 149 | ||
148 | warmup :: [SetScheme] | 150 | warmup :: [SetScheme] |
149 | warmup = [setScheme 40 5, setScheme 50 5, setScheme 60 3] | 151 | warmup = [setScheme 40 5, setScheme 50 5, setScheme 60 3] |
150 | 152 | ||
153 | downSets :: [SetScheme] | ||
154 | downSets = take 5 $ repeat $ setScheme 75 5 | ||
155 | |||
151 | liftScheme :: SetOption -> WeekSelection -> [SetScheme] | 156 | liftScheme :: SetOption -> WeekSelection -> [SetScheme] |
152 | liftScheme Fresher Week1 = warmup ++ [setScheme 65 5, setScheme 75 5, setScheme 85 5] | 157 | liftScheme Fresher Week1 = warmup ++ [setScheme 65 5, setScheme 75 5, setSchemeAMRAP 85 5] ++ downSets |
153 | liftScheme Heavier Week1 = warmup ++ [setScheme 75 5, setScheme 80 5, setScheme 85 5] | 158 | liftScheme Heavier Week1 = warmup ++ [setScheme 75 5, setScheme 80 5, setSchemeAMRAP 85 5] ++ downSets |
154 | liftScheme Fresher Week2 = warmup ++ [setScheme 70 3, setScheme 80 3, setScheme 90 3] | 159 | liftScheme Fresher Week2 = warmup ++ [setScheme 70 3, setScheme 80 3, setSchemeAMRAP 90 3] ++ downSets |
155 | liftScheme Heavier Week2 = warmup ++ [setScheme 80 3, setScheme 85 3, setScheme 90 3] | 160 | liftScheme Heavier Week2 = warmup ++ [setScheme 80 3, setScheme 85 3, setSchemeAMRAP 90 3] ++ downSets |
156 | liftScheme _______ Week3 = warmup ++ [setScheme 75 5, setScheme 85 3, setScheme 95 1] | 161 | liftScheme _______ Week3 = warmup ++ [setScheme 75 5, setScheme 85 3, setSchemeAMRAP 95 1] ++ downSets |
157 | 162 | ||
158 | data ListPosition = FirstInList | LastInList | MiddleInList deriving (Eq) | 163 | data ListPosition = FirstInList | NotFirstInList deriving (Eq) |
159 | 164 | ||
160 | annotatePosition :: [a] -> [(ListPosition, a)] | 165 | annotatePosition :: [a] -> [(ListPosition, a)] |
161 | annotatePosition [] = undefined | 166 | annotatePosition [] = undefined |
162 | annotatePosition [x] = [(LastInList, x)] | 167 | annotatePosition (x:xs) = (FirstInList, x) : map (NotFirstInList,) xs |
163 | annotatePosition (x:xs) = (FirstInList, x) : annotateRest xs | ||
164 | where | ||
165 | annotateRest [] = undefined | ||
166 | annotateRest [x] = [(LastInList, x)] | ||
167 | annotateRest (x:xs) = (MiddleInList, x) : annotateRest xs | ||
168 | 168 | ||
169 | drawUI :: St -> [Widget ()] | 169 | drawUI :: St -> [Widget ()] |
170 | drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, header, withVScrollBarHandles $ withVScrollBars OnRight $ viewport () Vertical $ hCenter lastSetTable]] | 170 | drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, header, withVScrollBarHandles $ withVScrollBars OnRight $ viewport () Vertical $ hCenter lastSetTable]] |
@@ -185,7 +185,7 @@ drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, header, withVScrollBarHandl | |||
185 | toLiftRows :: WeekSelection -> LiftRecord -> [[Widget n]] | 185 | toLiftRows :: WeekSelection -> LiftRecord -> [[Widget n]] |
186 | toLiftRows week lift = (flip map) (annotatePosition $ liftScheme Fresher week) $ toLiftRow lift | 186 | toLiftRows week lift = (flip map) (annotatePosition $ liftScheme Fresher week) $ toLiftRow lift |
187 | toLiftRow :: LiftRecord -> (ListPosition, SetScheme) -> [Widget n] | 187 | toLiftRow :: LiftRecord -> (ListPosition, SetScheme) -> [Widget n] |
188 | toLiftRow LiftRecord{..} (position, (SetScheme targetRatio targetReps)) = | 188 | toLiftRow LiftRecord{..} (position, (SetScheme targetRatio targetReps amrap)) = |
189 | let best = bestPerformance stats | 189 | let best = bestPerformance stats |
190 | computedTarget = targetRatio * (90 % 100) * computeOneRepMax best | 190 | computedTarget = targetRatio * (90 % 100) * computeOneRepMax best |
191 | targetWeight = ceilingN 5 computedTarget | 191 | targetWeight = ceilingN 5 computedTarget |
@@ -196,11 +196,11 @@ drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, header, withVScrollBarHandl | |||
196 | map (padLeftRight 2) | 196 | map (padLeftRight 2) |
197 | [ | 197 | [ |
198 | -- txt $ if position == FirstInList then liftName else " ", | 198 | -- txt $ if position == FirstInList then liftName else " ", |
199 | txt $ case position of FirstInList -> liftName; LastInList -> " \n "; _ -> " ", | 199 | txt $ case position of FirstInList -> liftName; NotFirstInList -> if amrap then " \n " else " ", |
200 | str $ printf "%2d%s @ %d%s" targetReps (if position == LastInList then "+" else "" :: Text) targetWeight (if position == LastInList then "\n " else "" :: String), | 200 | str $ printf "%2d%s @ %d%s" targetReps (if amrap then "+" else "" :: Text) targetWeight (if amrap then "\n " else "" :: String), |
201 | str $ if position /= LastInList then " " else showGoal repGoal ++ "\n" ++ showGoal (repGoal + 1), | 201 | str $ if amrap then showGoal repGoal ++ "\n" ++ showGoal (repGoal + 1) else " ", |
202 | txt $ if position /= LastInList then " " else " \n ", | 202 | txt $ if amrap then " \n " else " ", |
203 | txt $ if position /= LastInList then " " else " \n " | 203 | txt $ if amrap then " \n " else " " |
204 | ] | 204 | ] |
205 | 205 | ||
206 | ceilingN :: Integer -> Rational -> Integer | 206 | ceilingN :: Integer -> Rational -> Integer |
@@ -252,7 +252,8 @@ jerk = pushPress / 100 * 85 | |||
252 | routine :: NonEmpty (Set Text) | 252 | routine :: NonEmpty (Set Text) |
253 | routine = NonEmpty.cycle $ | 253 | routine = NonEmpty.cycle $ |
254 | Set.fromList ["Deadlift", "Press"] :| | 254 | Set.fromList ["Deadlift", "Press"] :| |
255 | [Set.fromList ["Front Squat", "Left-Arm Snatch", "Right-Arm Snatch"] | 255 | [Set.fromList ["Front Squat"] |
256 | , Set.fromList ["Left-Arm Snatch", "Right-Arm Snatch"] | ||
256 | , Set.fromList ["Squat", "Bench"] | 257 | , Set.fromList ["Squat", "Bench"] |
257 | , Set.fromList ["Push Press", "Power Clean"] | 258 | , Set.fromList ["Push Press", "Power Clean"] |
258 | ] | 259 | ] |