From 55370844e691cfcf334eb7d79f07ac68e11b9240 Mon Sep 17 00:00:00 2001 From: Andrew Cady Date: Fri, 21 Oct 2022 01:33:22 -0400 Subject: show entire 5/3/1 progression --- repgoal.hs | 55 +++++++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 41 insertions(+), 14 deletions(-) (limited to 'repgoal.hs') diff --git a/repgoal.hs b/repgoal.hs index 631085c..11bfd5c 100755 --- a/repgoal.hs +++ b/repgoal.hs @@ -134,11 +134,38 @@ makeLenses ''St -- TODO: Event for inotify on edited text file (as input interface) data CustomEvent = CustomEvent +data SetScheme = SetScheme { ratioMax :: Rational, numberOfReps :: Integer } + +setScheme :: Rational -> Integer -> SetScheme +setScheme percentage reps = SetScheme (percentage / 100) reps + +data SetOption = Fresher | Heavier + +warmup :: [SetScheme] +warmup = [setScheme 40 5, setScheme 50 5, setScheme 60 3] + +liftScheme :: SetOption -> WeekSelection -> [SetScheme] +liftScheme Fresher Week1 = warmup ++ [setScheme 65 5, setScheme 75 5, setScheme 85 5] +liftScheme Heavier Week1 = warmup ++ [setScheme 75 5, setScheme 80 5, setScheme 85 5] +liftScheme Fresher Week2 = warmup ++ [setScheme 70 3, setScheme 80 3, setScheme 90 3] +liftScheme Heavier Week2 = warmup ++ [setScheme 80 3, setScheme 85 3, setScheme 90 3] +liftScheme _______ Week3 = warmup ++ [setScheme 75 5, setScheme 85 3, setScheme 95 1] + +data ListPosition = FirstInList | LastInList | MiddleInList deriving (Eq) + +annotatePosition :: [a] -> [(ListPosition, a)] +annotatePosition [] = undefined +annotatePosition [x] = [(LastInList, x)] +annotatePosition (x:xs) = (FirstInList, x) : annotateRest xs + where + annotateRest [] = undefined + annotateRest [x] = [(LastInList, x)] + annotateRest (x:xs) = (MiddleInList, x) : annotateRest xs + drawUI :: St -> [Widget ()] drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, withVScrollBarHandles $ withVScrollBars OnRight $ viewport () Vertical $ hCenter lastSetTable]] where - -- lastSetTable = renderTable $ table $ map (padLeftRight 1 . str) ["Lift", "Week", "Last Set", "Goal", "Goal+1"] : concatMap toWeekRows (view lifts st) - lastSetTable = renderTable $ table $ map (padLeftRight 1 . str) ["Lift", "Week", "Last Set", "Goal", "Goal+1"] : map (toWeekRow (view week st)) (view lifts st) + lastSetTable = renderTable $ table $ map (padLeftRight 1 . str) ["Lift", "Set", "Goal"] : concatMap (toLiftRows (view week st)) (view lifts st) oneRepMaxTable = renderTable $ table $ map (padLeftRight 1 . str) ["Lift", "Achieved Best", "Computed 1RM"] : map toRow (view lifts st) toRow LiftRecord{..} = let best@Achieved{..} = bestPerformance stats @@ -149,13 +176,12 @@ drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, withVScrollBarHandles $ wit str $ printf "%d @ %d" achievedReps achievedWeight, str $ showRational $ computeOneRepMax best ] - -- toWeekRows lift = (flip map) [1,2,3::Int] $ \week -> toWeekRow week lift - toWeekRow :: WeekSelection -> LiftRecord -> [Widget n] - toWeekRow week LiftRecord{..} = + toLiftRows :: WeekSelection -> LiftRecord -> [[Widget n]] + toLiftRows week lift = (flip map) (annotatePosition $ liftScheme Fresher week) $ toLiftRow week lift + toLiftRow :: WeekSelection -> LiftRecord -> (ListPosition, SetScheme) -> [Widget n] + toLiftRow week LiftRecord{..} (position, (SetScheme targetRatio targetReps)) = let best = bestPerformance stats - targetReps = case week of Week1 -> 5; Week2 -> 3; Week3 -> 1 :: Int - targetPercentage = case week of Week1 -> 85; Week2 -> 90; Week3 -> 95 - computedTarget = (* (targetPercentage % 100)) $ (* (90 % 100)) $ computeOneRepMax best + computedTarget = targetRatio * (90 % 100) * computeOneRepMax best targetWeight = ceilingN 5 computedTarget repGoal = computeRepGoal targetWeight stats goalTo1RM g = computeOneRepMax $ Achieved g targetWeight @@ -163,12 +189,13 @@ drawUI st = [vCenter $ vBox [hCenter oneRepMaxTable, withVScrollBarHandles $ wit in map (padLeftRight 2) [ - -- txt $ (if week == 1 then liftName else " "), - txt $ liftName, - txt $ case week of Week1 -> "1"; Week2 -> "2"; Week3 -> "3", - str $ printf "%2d+ @ %d" targetReps targetWeight, - str $ showGoal repGoal, - str $ showGoal (repGoal + 1) + -- txt $ if position == FirstInList then liftName else " ", + txt $ case position of FirstInList -> liftName; LastInList -> " \n "; _ -> " ", + -- txt $ case week of Week1 -> "1"; Week2 -> "2"; Week3 -> "3", + str $ printf "%2d%s @ %d%s" targetReps (if position == LastInList then "+" else "" :: Text) targetWeight (if position == LastInList then "\n " else "" :: String), + str $ if position /= LastInList then " " else showGoal repGoal ++ "\n" ++ showGoal (repGoal + 1) + -- str $ if position /= LastInList then " " else showGoal repGoal, + -- str $ if position /= LastInList then " " else showGoal (repGoal + 1) ] ceilingN :: Integer -> Rational -> Integer -- cgit v1.2.3