module Holidays.Base (
  Holiday (..),
  ISO_3166_1_Alpha_3,
  Region,
  day,
  hday,
  nullDay,
  validDay,
) where

import Data.Text qualified as T
import Data.Time

-- | 3-letter country codes.
type ISO_3166_1_Alpha_3 = T.Text

-- | Custom regions for a country.
type Region = T.Text

data Holiday
  = Holiday
  { Holiday -> Text
holidayKey :: T.Text,
    Holiday -> Day
holidayValue :: Day
  }
  deriving (Eq Holiday
Eq Holiday
-> (Holiday -> Holiday -> Ordering)
-> (Holiday -> Holiday -> Bool)
-> (Holiday -> Holiday -> Bool)
-> (Holiday -> Holiday -> Bool)
-> (Holiday -> Holiday -> Bool)
-> (Holiday -> Holiday -> Holiday)
-> (Holiday -> Holiday -> Holiday)
-> Ord Holiday
Holiday -> Holiday -> Bool
Holiday -> Holiday -> Ordering
Holiday -> Holiday -> Holiday
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Holiday -> Holiday -> Ordering
compare :: Holiday -> Holiday -> Ordering
$c< :: Holiday -> Holiday -> Bool
< :: Holiday -> Holiday -> Bool
$c<= :: Holiday -> Holiday -> Bool
<= :: Holiday -> Holiday -> Bool
$c> :: Holiday -> Holiday -> Bool
> :: Holiday -> Holiday -> Bool
$c>= :: Holiday -> Holiday -> Bool
>= :: Holiday -> Holiday -> Bool
$cmax :: Holiday -> Holiday -> Holiday
max :: Holiday -> Holiday -> Holiday
$cmin :: Holiday -> Holiday -> Holiday
min :: Holiday -> Holiday -> Holiday
Ord, Holiday -> Holiday -> Bool
(Holiday -> Holiday -> Bool)
-> (Holiday -> Holiday -> Bool) -> Eq Holiday
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Holiday -> Holiday -> Bool
== :: Holiday -> Holiday -> Bool
$c/= :: Holiday -> Holiday -> Bool
/= :: Holiday -> Holiday -> Bool
Eq, Int -> Holiday -> ShowS
[Holiday] -> ShowS
Holiday -> String
(Int -> Holiday -> ShowS)
-> (Holiday -> String) -> ([Holiday] -> ShowS) -> Show Holiday
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Holiday -> ShowS
showsPrec :: Int -> Holiday -> ShowS
$cshow :: Holiday -> String
show :: Holiday -> String
$cshowList :: [Holiday] -> ShowS
showList :: [Holiday] -> ShowS
Show)

-- | Constructor for a Day. Equivalent to the fromGregorian function.
day :: Year -> MonthOfYear -> DayOfMonth -> Day
day :: Year -> Int -> Int -> Day
day = Year -> Int -> Int -> Day
fromGregorian

-- | Constructor for a Holiday.
hday :: T.Text -> Day -> Holiday
hday :: Text -> Day -> Holiday
hday Text
k Day
d = Holiday {holidayKey :: Text
holidayKey = Text
k, holidayValue :: Day
holidayValue = Day
d}

-- | Convention for filtering out invalid dates.
nullDay :: Day
nullDay :: Day
nullDay = Year -> Int -> Int -> Day
day Year
0 Int
0 Int
0

-- | Day is valid if its not a nullDate
validDay :: Day -> Bool
validDay :: Day -> Bool
validDay = Bool -> Bool
not (Bool -> Bool) -> (Day -> Bool) -> Day -> Bool
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Day
nullDay ==)