Write a program or a script that returns the last Sundays of each month of a given year. The year may be given through any simple input method in your language (command line, std in, etc).

Example of an expected output:

./last_sundays 2013
2013-01-27
2013-02-24
2013-03-31
2013-04-28
2013-05-26
2013-06-30
2013-07-28
2013-08-25
2013-09-29
2013-10-27
2013-11-24
2013-12-29


Related tasks
 Day of the week
 Five weekends
 Last Friday of each month


import Data.List (find, intercalate, transpose)
import Data.Maybe (fromJust)
import Data.Time.Calendar
  ( Day,
    addDays,
    fromGregorian,
    gregorianMonthLength,
    showGregorian,
  )
import Data.Time.Calendar.WeekDate (toWeekDate)
 
---------------- LAST SUNDAY OF EACH MONTH ---------------
 
lastSundayOfEachMonth = lastWeekDayDates 7
 
--------------------------- TEST -------------------------
main :: IO ()
main =
  mapM_
    putStrLn
    ( intercalate "  "
        <$> transpose
          (lastSundayOfEachMonth <$> [2013 .. 2017])
    )
 
------------------- NEAREST DAY OF WEEK ------------------
 
lastWeekDayDates :: Int -> Integer -> [String]
lastWeekDayDates dayOfWeek year =
  (showGregorian . mostRecentWeekday dayOfWeek)
    . (fromGregorian year <*> gregorianMonthLength year)
    <$> [1 .. 12]
 
mostRecentWeekday :: Int -> Day -> Day
mostRecentWeekday dayOfWeek date =
  fromJust
    (find p ((`addDays` date) <$> [-6 .. 0]))
  where
    p x =
      let (_, _, day) = toWeekDate x
       in dayOfWeek == day