Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- data Month = January | February | March | April | May | June | July | August | September | October | November | December deriving (Show, Eq, Enum)
- data DoW = Sunday | Monday | Tuesday | Wednesday | Thursday | Friday | Saturday deriving (Show, Enum)
- (.:) :: Month -> Int -> Month
- a .: b = toEnum $ flip mod 12 $ 12 + fromEnum a - b
- calc_leapyear :: Int -> Bool
- calc_leapyear y = (y `mod` 4 == 0 && y `mod` 100 /= 0) || (y `mod` 4 == 0 && y `mod` 400 == 0)
- get_max_days :: Month -> Int
- get_max_days m | m == January || m == March || m == May || m == July || m == August || m == October || m == December = 31
- | m == April || m == June || m == September || m == November = 30
- | otherwise = 28
- day_digit :: Int -> Int
- day_digit d = d `mod` 7
- month_digit :: Month -> Int
- month_digit January = 0
- month_digit a = flip mod 7 $ (get_max_days $ a .: 1) `mod` 7 + (month_digit $ a .: 1)
- year_digit :: Int -> Int
- year_digit y = ((y `mod` 100) + ((y `mod` 100) `quot` 4)) `mod` 7
- century_digit :: Int -> Int
- century_digit y = (3 - ((y `quot` 100) `mod` 4)) * 2
- ly_correction :: Month -> Int -> Int
- ly_correction m y | calc_leapyear(y) && (m == January || m == February) = -1
- | otherwise = 0
- calc_day_of_week :: Int -> Month -> Int -> DoW
- calc_day_of_week d m y = toEnum $ flip mod 7 $ day_digit d + month_digit m + year_digit y + century_digit y + ly_correction m y
Advertisement
Add Comment
Please, Sign In to add comment