module Data.Holiday.USA
( Holiday(Holiday)
, getHoliday
) where
import qualified Data.Time as Time
import qualified Data.Time.Calendar.WeekDate as Time
data Holiday =
Holiday
{ holiday_day :: Time.Day
, holiday_name :: String
}
deriving (Eq, Show)
getHoliday :: Time.Day -> Maybe Holiday
getHoliday d
| isChristmas d = Just (Holiday d "Christmas")
| isThanksgiving d = Just (Holiday d "Thanksgiving")
| isIndependence d = Just (Holiday d "Independence Day")
| isNewYearsEve d = Just (Holiday d "New Year's Eve")
| isMemorialDay d = Just (Holiday d "Memorial Day")
| isLaborDay d = Just (Holiday d "Labor Day")
| isMartinLutherKingJrDay d = Just (Holiday d "Martin Luther King Jr. Day")
| otherwise = Nothing
where
isChristmas :: Time.Day -> Bool
isChristmas _d =
let (_, month, day) = Time.toGregorian _d
in month == 12 && day == 25
isThanksgiving :: Time.Day -> Bool
isThanksgiving _d =
let (_, month, day) = Time.toGregorian _d
in month == 11 && 22 <= day && day <= 28 && getDayOfWeek _d == Thursday
isIndependence :: Time.Day -> Bool
isIndependence _d =
let (_, month, day) = Time.toGregorian _d
in month == 7 && day == 4
isNewYearsEve :: Time.Day -> Bool
isNewYearsEve _d =
let (_, month, day) = Time.toGregorian _d
in month == 12 && day == 31
isMemorialDay _d =
let (_, month, day) = Time.toGregorian _d
in month == 5 && 25 <= day && day <= 31 && getDayOfWeek _d == Monday
isLaborDay _d =
let (_, month, day) = Time.toGregorian _d
in month == 9 && 1 <= day && day <= 7 && getDayOfWeek _d == Monday
isMartinLutherKingJrDay :: Time.Day -> Bool
isMartinLutherKingJrDay _d =
let (_, month, day) = Time.toGregorian _d
in month == 1 && 15 <= day && day <= 21 && getDayOfWeek _d == Monday
data DayOfWeek
= Monday
| Tuesday
| Wednesday
| Thursday
| Friday
| Saturday
| Sunday
deriving (Enum, Eq, Show)
getDayOfWeek :: Time.Day -> DayOfWeek
getDayOfWeek d =
let (_, _, dow) = Time.toWeekDate d
in toEnum (dow - 1)