Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- {-# LANGUAGE TypeApplications #-}
- module Library
- ( Input(..)
- , Output(..)
- , Monday(..)
- , Wednesday(..)
- , Friday(..)
- , run
- )
- where
- interval :: Float
- interval = 12.5
- minPlate :: Float
- minPlate = 1.25
- data Input = Input
- { inputSquat :: Float
- , inputBench :: Float
- , inputDeadlift :: Float
- , inputPress :: Float
- , inputRow :: Float
- } deriving (Eq, Show)
- data Output = Output
- { outputMonday :: Monday
- , outputWednesday :: Wednesday
- , outputFriday :: Friday
- } deriving (Eq, Show)
- data Monday = Monday
- { mondaySquat :: [Float]
- , mondayBench :: [Float]
- , mondayRow :: [Float]
- } deriving (Eq, Show)
- data Wednesday = Wednesday
- { wednesdaySquat :: [Float]
- , wednesdayPress :: [Float]
- , wednesdayDeadlift :: [Float]
- } deriving (Eq, Show)
- data Friday = Friday
- { fridaySquat :: [Float]
- , fridayBench :: [Float]
- , fridayRow :: [Float]
- } deriving (Eq, Show)
- run :: Input -> Output
- run input = Output { outputMonday = mkMonday input
- , outputWednesday = mkWednesday input
- , outputFriday = mkFriday input
- }
- mkMonday :: Input -> Monday
- mkMonday input = Monday { mondaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputSquat input * (1 - (interval / 100))
- , ceilWeight $ inputSquat input
- ]
- , mondayBench = [ ceilWeight $ inputBench input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputBench input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputBench input * (1 - (interval / 100))
- , ceilWeight $ inputBench input
- ]
- , mondayRow = [ ceilWeight $ inputRow input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputRow input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputRow input * (1 - (interval / 100))
- , ceilWeight $ inputRow input
- ]
- }
- mkWednesday :: Input -> Wednesday
- mkWednesday input = Wednesday { wednesdaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
- ]
- , wednesdayPress = [ ceilWeight $ inputPress input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputPress input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputPress input * (1 - (interval / 100))
- , ceilWeight $ inputPress input
- ]
- , wednesdayDeadlift = [ ceilWeight $ inputDeadlift input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputDeadlift input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputDeadlift input * (1 - (interval / 100))
- , ceilWeight $ inputDeadlift input
- ]
- }
- mkFriday :: Input -> Friday
- mkFriday input = Friday { fridaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputSquat input * (1 - (interval / 100))
- , ceilWeight $ inputSquat input + minPlate * 2
- , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
- ]
- , fridayBench = [ ceilWeight $ inputBench input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputBench input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputBench input * (1 - (interval / 100))
- , ceilWeight $ inputBench input + minPlate * 2
- , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
- ]
- , fridayRow = [ ceilWeight $ inputRow input * (1 - (interval / 100) * 4)
- , ceilWeight $ inputRow input * (1 - (interval / 100) * 3)
- , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
- , ceilWeight $ inputRow input * (1 - (interval / 100))
- , ceilWeight $ inputRow input + minPlate * 2
- , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
- ]
- }
- ceilWeight :: Float -> Float
- ceilWeight x = minPlates * (fromIntegral @Integer . ceiling $ x / minPlates)
- where minPlates = minPlate * 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement