Advertisement
Guest User

Untitled

a guest
Aug 11th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. {-# LANGUAGE TypeApplications #-}
  2. module Library
  3.   ( Input(..)
  4.   , Output(..)
  5.   , Monday(..)
  6.   , Wednesday(..)
  7.   , Friday(..)
  8.   , run
  9.   )
  10. where
  11.  
  12. interval :: Float
  13. interval = 12.5
  14.  
  15. minPlate :: Float
  16. minPlate = 1.25
  17.  
  18. data Input = Input
  19.   { inputSquat :: Float
  20.   , inputBench :: Float
  21.   , inputDeadlift :: Float
  22.   , inputPress :: Float
  23.   , inputRow :: Float
  24.   } deriving (Eq, Show)
  25.  
  26. data Output = Output
  27.   { outputMonday :: Monday
  28.   , outputWednesday :: Wednesday
  29.   , outputFriday :: Friday
  30.   } deriving (Eq, Show)
  31.  
  32. data Monday = Monday
  33.   { mondaySquat :: [Float]
  34.   , mondayBench :: [Float]
  35.   , mondayRow :: [Float]
  36.   } deriving (Eq, Show)
  37.  
  38. data Wednesday = Wednesday
  39.   { wednesdaySquat :: [Float]
  40.   , wednesdayPress :: [Float]
  41.   , wednesdayDeadlift :: [Float]
  42.   } deriving (Eq, Show)
  43.  
  44. data Friday = Friday
  45.   { fridaySquat :: [Float]
  46.   , fridayBench :: [Float]
  47.   , fridayRow :: [Float]
  48.   } deriving (Eq, Show)
  49.  
  50. run :: Input -> Output
  51. run input = Output { outputMonday = mkMonday input
  52.                    , outputWednesday = mkWednesday input
  53.                    , outputFriday = mkFriday input
  54.                    }
  55.  
  56. mkMonday :: Input -> Monday
  57. mkMonday input = Monday { mondaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
  58.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
  59.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
  60.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100))
  61.                                         , ceilWeight $ inputSquat input
  62.                                         ]
  63.                         , mondayBench = [ ceilWeight $ inputBench input * (1 - (interval / 100) * 4)
  64.                                         , ceilWeight $ inputBench input * (1 - (interval / 100) * 3)
  65.                                         , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
  66.                                         , ceilWeight $ inputBench input * (1 - (interval / 100))
  67.                                         , ceilWeight $ inputBench input
  68.                                         ]
  69.                         , mondayRow = [ ceilWeight $ inputRow input * (1 - (interval / 100) * 4)
  70.                                       , ceilWeight $ inputRow input * (1 - (interval / 100) * 3)
  71.                                       , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
  72.                                       , ceilWeight $ inputRow input * (1 - (interval / 100))
  73.                                       , ceilWeight $ inputRow input
  74.                                       ]
  75.                         }
  76.  
  77. mkWednesday :: Input -> Wednesday
  78. mkWednesday input = Wednesday { wednesdaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
  79.                                                  , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
  80.                                                  , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
  81.                                                  , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
  82.                                                  ]
  83.                               , wednesdayPress = [ ceilWeight $ inputPress input * (1 - (interval / 100) * 3)
  84.                                                  , ceilWeight $ inputPress input * (1 - (interval / 100) * 2)
  85.                                                  , ceilWeight $ inputPress input * (1 - (interval / 100))
  86.                                                  , ceilWeight $ inputPress input
  87.                                                  ]
  88.                               , wednesdayDeadlift = [ ceilWeight $ inputDeadlift input * (1 - (interval / 100) * 3)
  89.                                                     , ceilWeight $ inputDeadlift input * (1 - (interval / 100) * 2)
  90.                                                     , ceilWeight $ inputDeadlift input * (1 - (interval / 100))
  91.                                                     , ceilWeight $ inputDeadlift input
  92.                                                     ]
  93.                               }
  94.  
  95. mkFriday :: Input -> Friday
  96. mkFriday input = Friday { fridaySquat = [ ceilWeight $ inputSquat input * (1 - (interval / 100) * 4)
  97.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100) * 3)
  98.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
  99.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100))
  100.                                         , ceilWeight $ inputSquat input + minPlate * 2
  101.                                         , ceilWeight $ inputSquat input * (1 - (interval / 100) * 2)
  102.                                         ]
  103.                         , fridayBench = [ ceilWeight $ inputBench input * (1 - (interval / 100) * 4)
  104.                                         , ceilWeight $ inputBench input * (1 - (interval / 100) * 3)
  105.                                         , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
  106.                                         , ceilWeight $ inputBench input * (1 - (interval / 100))
  107.                                         , ceilWeight $ inputBench input + minPlate * 2
  108.                                         , ceilWeight $ inputBench input * (1 - (interval / 100) * 2)
  109.                                         ]
  110.                         , fridayRow = [ ceilWeight $ inputRow input * (1 - (interval / 100) * 4)
  111.                                       , ceilWeight $ inputRow input * (1 - (interval / 100) * 3)
  112.                                       , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
  113.                                       , ceilWeight $ inputRow input * (1 - (interval / 100))
  114.                                       , ceilWeight $ inputRow input + minPlate * 2
  115.                                       , ceilWeight $ inputRow input * (1 - (interval / 100) * 2)
  116.                                       ]
  117.                         }
  118.  
  119. ceilWeight :: Float -> Float
  120. ceilWeight x = minPlates * (fromIntegral @Integer . ceiling $ x / minPlates)
  121.   where minPlates = minPlate * 2
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement