packages feed

holidays 0.1.0.0 → 0.2.0.0

raw patch · 20 files changed

+402/−257 lines, 20 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

+ Holidays: Holiday :: Text -> Day -> Holiday
+ Holidays: [holidayKey] :: Holiday -> Text
+ Holidays: [holidayValue] :: Holiday -> Day
+ Holidays: data Holiday
+ Holidays: hday :: Text -> Day -> Holiday
- Holidays: holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> Set Day
+ Holidays: holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> Set Holiday

Files

CHANGELOG.md view
@@ -5,3 +5,8 @@ - ZAF, NAM, USA, GBR, DEU - support for country regions - unit + property based tests++## **0.2.0.0** - 2025-02-17+- new Holiday data type+- use "holidayKey" for a textual description+- new countries supported: MOZ
holidays.cabal view
@@ -1,7 +1,7 @@ cabal-version: 3.8  name: holidays-version: 0.1.0.0+version: 0.2.0.0 synopsis: Library for country public holidays description:   Library for country public holidays. Provides a small EDSL to describe holidays for a country.@@ -37,6 +37,7 @@     Holidays.DateFinder     Holidays.DateTransform     Holidays.Germany+    Holidays.Mozambique     Holidays.Namibia     Holidays.SouthAfrica     Holidays.UnitedKingdom@@ -57,6 +58,7 @@   other-modules:     Test.Holidays     Test.Holidays.Germany+    Test.Holidays.Mozambique     Test.Holidays.Namibia     Test.Holidays.SouthAfrica     Test.Holidays.UnitedKingdom
src/Holidays.hs view
@@ -7,15 +7,17 @@   ISO_3166_1_Alpha_3,   Region,   holidays,+  hday,+  Holiday (..), ) where  import Data.Set qualified as S import Data.Time import Holidays.Base-import Holidays.DateFinder import Holidays.DateTransform import Holidays.Germany qualified as DEU+import Holidays.Mozambique qualified as MOZ import Holidays.Namibia qualified as NAM import Holidays.SouthAfrica qualified as ZAF import Holidays.UnitedKingdom qualified as GBR@@ -24,27 +26,28 @@ {- | Returns a set of public holidays based on the country code (ISO_3166_1_Alpha_3) and a specific year. If a country is not supported an empty set is returned.-Allowed to specify regions in a country to further determine holidays.+Country regions are also supported.  Examples:  @-holidays "DEU" ["BW","BY","BE"] 2025 -- Germany and various states-holidays "USA" [] 2025+holidays \"DEU\" [\"BW\",\"BY\",\"BE\"] 2025 -- Germany and various regions+holidays \"USA\" [] 2025 @ -}-holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> S.Set Day+holidays :: ISO_3166_1_Alpha_3 -> [Region] -> Year -> S.Set Holiday holidays countryCode regions year =   case countryCode of     "DEU" -> DEU.holidays regions `apply` year     "GBR" -> GBR.holidays `apply` year+    "MOZ" -> MOZ.holidays `apply` year     "NAM" -> NAM.holidays `apply` year     "USA" -> USA.holidays `apply` year     "ZAF" -> ZAF.holidays `apply` year     _ -> S.empty --- Applies year and transformations to holidays-apply :: (DateFinders, DateTransforms) -> Year -> S.Set Day-apply (finders, transforms) year =-  let validDays = filter valid $ map (\d -> d year) finders -- apply year and filter out invalid days+-- | Applies year and date transformations to holidays+apply :: ([Year -> Holiday], [DateTransform]) -> Year -> S.Set Holiday+apply (hs, transforms) year =+  let validDays = filter (validDay . holidayValue) $ map (\d -> d year) hs -- apply year and filter out invalid days   in  foldr (\d ds -> S.insert (foldr (\t d' -> t ds d') d transforms) ds) S.empty validDays -- apply transforms to valid days
src/Holidays/Base.hs view
@@ -1,17 +1,41 @@ 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+-- | 3-letter country codes. type ISO_3166_1_Alpha_3 = T.Text --- | Custom regions for a country+-- | Custom regions for a country. type Region = T.Text +data Holiday+  = Holiday+  { holidayKey :: T.Text,+    holidayValue :: Day+  }+  deriving (Ord, Eq, Show)++-- | Constructor for a Day. Equivalent to the fromGregorian function. day :: Year -> MonthOfYear -> DayOfMonth -> Day day = fromGregorian++-- | Constructor for a Holiday.+hday :: T.Text -> Day -> Holiday+hday k d = Holiday {holidayKey = k, holidayValue = d}++-- | Convention for filtering out invalid dates.+nullDay :: Day+nullDay = day 0 0 0++-- | Day is valid if its not a nullDate+validDay :: Day -> Bool+validDay = not . (nullDay ==)
src/Holidays/DateFinder.hs view
@@ -1,7 +1,7 @@ module Holidays.DateFinder (   after,   before,-  valid,+  nextOpenDay,   days,   years,   sun,@@ -31,8 +31,6 @@   newYearsDay,   ascensionDay,   workersDay,-  nextOpenDay,-  DateFinders, ) where  import Data.Maybe@@ -44,8 +42,6 @@  data Direction = Past | Future -type DateFinders = [Year -> Day]- -- common dates newYearsDay :: Year -> Day newYearsDay = jan 1@@ -71,18 +67,11 @@ workersDay :: Year -> Day workersDay = may 1 --- utils-nullDate :: Day-nullDate = day 0 0 0--valid :: Day -> Bool-valid = not . (nullDate ==)- days :: Integer -> (Integer -> Maybe DayOfWeek -> Day) -> Day days n f = f n Nothing  years :: (Year -> Bool) -> Day -> Day-years f d = if f (fromIntegral y) then d else nullDate+years f d = if f (fromIntegral y) then d else nullDay   where     (y, _, _) = toGregorian d @@ -125,14 +114,15 @@  -- time travel --- exclusive of before day+-- | Time-travel to the past in number of days. Excludes the specified Day. before :: Day -> Integer -> Maybe DayOfWeek -> Day before = timeTravel Past --- inclusive of after day+-- | Time-travel to the past in number of days. Includes the specified Day. after :: Day -> Integer -> Maybe DayOfWeek -> Day after = timeTravel Future +-- | Time-travels to the past or future by adding a number of days. timeTravel :: Direction -> Day -> Integer -> Maybe DayOfWeek -> Day timeTravel Past d n w   | isNothing w = addDays (negate n) d@@ -167,8 +157,11 @@ sat :: Integer -> (Integer -> Maybe DayOfWeek -> Day) -> Day sat n f = f n (Just Saturday) -nextOpenDay :: [DayOfWeek] -> S.Set Day -> Day -> Day+-- | Get the next open day by skipping days which are already holidays or specified days of the week.+nextOpenDay :: [DayOfWeek] -> S.Set Holiday -> Holiday -> Holiday nextOpenDay ds s d-  | dayOfWeek d `elem` ds = nextOpenDay ds s (addDays 1 d)-  | S.member d s = nextOpenDay ds s (addDays 1 d)+  | dayOfWeek d' `elem` ds = nextOpenDay ds s (d {holidayValue = addDays 1 d'})+  | S.member d s = nextOpenDay ds s (d {holidayValue = addDays 1 d'})   | otherwise = d+  where+    d' = holidayValue d
src/Holidays/DateTransform.hs view
@@ -1,19 +1,22 @@ module Holidays.DateTransform (   substituteRule,   sundayRule,-  DateTransforms+  DateTransform, ) where  import Data.Set qualified as S import Data.Time+import Holidays.Base import Holidays.DateFinder --type DateTransforms = [S.Set Day -> Day -> Day]+type DateTransform = S.Set Holiday -> Holiday -> Holiday --- general transformations-sundayRule :: S.Set Day -> Day -> Day-sundayRule _ d = if dayOfWeek d == Sunday then addDays 1 d else d -- mon after sunday+-- | If day is on a sunday, it moves to monday+sundayRule :: DateTransform+sundayRule _ d = if dayOfWeek h == Sunday then d {holidayValue = addDays 1 h} else d -- mon after sunday+  where+    h = holidayValue d -substituteRule :: S.Set Day -> Day -> Day+-- | Looks for next open day (day which is not a holiday), also skipping saturday and sunday+substituteRule :: DateTransform substituteRule = nextOpenDay [Saturday, Sunday]
src/Holidays/Germany.hs view
@@ -9,11 +9,13 @@   holidays, ) where +import Data.Time+ import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: [Region] -> (DateFinders, DateTransforms)+holidays :: [Region] -> ([Year -> Holiday], [DateTransform]) holidays regions =   ( concat       [ federalHolidays,@@ -22,20 +24,20 @@     []   ) -federalHolidays :: DateFinders+federalHolidays :: [Year -> Holiday] federalHolidays =-  [ newYearsDay,-    goodFriday,-    easterMonday,-    workersDay, -- labour day-    ascensionDay,-    (50 `days`) . after . easterSunday, -- whit monday-    oct 3, -- germany unity day-    christmasDay,-    boxingDay -- second day of christmas+  [ hday "new_years_day" . newYearsDay,+    hday "good_friday" . goodFriday,+    hday "easter_monday" . easterMonday,+    hday "labour_day" . workersDay,+    hday "ascension_day" . ascensionDay,+    hday "whit_monday" . (50 `days`) . after . easterSunday,+    hday "germany_unity_day" . oct 3,+    hday "christmas_day" . christmasDay,+    hday "second_day_of_christmas" . boxingDay   ] -regionalHolidays :: [Region] -> DateFinders+regionalHolidays :: [Region] -> [Year -> Holiday] regionalHolidays =   concatMap     ( \r -> case r of@@ -58,96 +60,114 @@         _ -> []     ) -badenWurttembergHolidays :: DateFinders+-- common holidays+epiphany :: Year -> Holiday+epiphany = hday "epiphany" . jan 6++corpusChristi :: Year -> Holiday+corpusChristi = hday "corpus_christi" . (60 `days`) . after . easterSunday++allSaintsDay :: Year -> Holiday+allSaintsDay = hday "all_saints_day" . nov 1++assumptionDay :: Year -> Holiday+assumptionDay = hday "assumption_day" . aug 15++internationalWomensDay :: Year -> Holiday+internationalWomensDay = hday "international_womens_day" . mar 8++reformationDay :: Year -> Holiday+reformationDay = hday "reformation_day" . oct 31++badenWurttembergHolidays :: [Year -> Holiday] badenWurttembergHolidays =-  [ jan 6, -- epiphany-    (60 `days`) . after . easterSunday, -- corpus christi-    nov 1 -- all saints day+  [ epiphany,+    corpusChristi,+    allSaintsDay   ] -bavariaHolidays :: DateFinders+bavariaHolidays :: [Year -> Holiday] bavariaHolidays =-  [ jan 6, -- epiphany-    (60 `days`) . after . easterSunday, -- corpus christi-    aug 15, -- assumption day-    nov 1 -- all saints day+  [ epiphany,+    corpusChristi,+    assumptionDay,+    allSaintsDay   ] -berlinHolidays :: DateFinders+berlinHolidays :: [Year -> Holiday] berlinHolidays =-  [ mar 8, -- international womens day-    nov 1, -- all saints day-    years (== 2025) . may 8 -- 80th anniversary of the end of world war 2+  [ internationalWomensDay,+    allSaintsDay,+    hday "80th_anniversary_of_end_of_world_war_2" . years (== 2025) . may 8   ] -brandenburgHolidays :: DateFinders+brandenburgHolidays :: [Year -> Holiday] brandenburgHolidays =-  [ easterSunday,-    (49 `days`) . after . easterSunday, -- whit sunday-    oct 31 -- reformation day+  [ hday "easter_sunday" . easterSunday,+    hday "whit_sunday" . (49 `days`) . after . easterSunday,+    reformationDay   ] -bremenHolidays :: DateFinders+bremenHolidays :: [Year -> Holiday] bremenHolidays =-  [ oct 31 -- reformation day+  [ reformationDay   ] -hamburgHolidays :: DateFinders+hamburgHolidays :: [Year -> Holiday] hamburgHolidays =-  [ oct 31 -- reformation day+  [ reformationDay   ] -hesseHolidays :: DateFinders+hesseHolidays :: [Year -> Holiday] hesseHolidays =-  [ (60 `days`) . after . easterSunday -- corpus christi-  ]+  [corpusChristi] -mecklenburgVorpommernHolidays :: DateFinders+mecklenburgVorpommernHolidays :: [Year -> Holiday] mecklenburgVorpommernHolidays =-  [ mar 8, -- international womens day-    oct 31 -- reformation day+  [ internationalWomensDay,+    reformationDay   ] -lowerSaxonyHolidays :: DateFinders+lowerSaxonyHolidays :: [Year -> Holiday] lowerSaxonyHolidays =-  [ oct 31 -- reformation day+  [ reformationDay   ] -northRhineWestphaliaHolidays :: DateFinders+northRhineWestphaliaHolidays :: [Year -> Holiday] northRhineWestphaliaHolidays =-  [ (60 `days`) . after . easterSunday, -- corpus christi-    nov 1 -- all saints day+  [ corpusChristi,+    allSaintsDay   ] -rhinelandPalatinateHolidays :: DateFinders+rhinelandPalatinateHolidays :: [Year -> Holiday] rhinelandPalatinateHolidays =-  [ (60 `days`) . after . easterSunday, -- corpus christi-    nov 1 -- all saints day+  [ corpusChristi,+    allSaintsDay   ] -saarlandHolidays :: DateFinders+saarlandHolidays :: [Year -> Holiday] saarlandHolidays =-  [ (60 `days`) . after . easterSunday, -- corpus christi-    aug 15, -- assumption day-    nov 1 -- all saints day+  [ corpusChristi,+    assumptionDay,+    allSaintsDay   ] -saxonyHolidays :: DateFinders+saxonyHolidays :: [Year -> Holiday] saxonyHolidays =-  [ (2 `wed`) . before . (4 `sun`) . before . christmasDay -- repentance and prayer day+  [ hday "repentance_and_prayer_day" . (2 `wed`) . before . (4 `sun`) . before . christmasDay   ] -saxonyAnhaltHolidays :: DateFinders+saxonyAnhaltHolidays :: [Year -> Holiday] saxonyAnhaltHolidays =-  [ jan 6, -- epiphany-    oct 31 -- reformation day+  [ epiphany,+    reformationDay   ] -schleswigHolsteinHolidays :: DateFinders+schleswigHolsteinHolidays :: [Year -> Holiday] schleswigHolsteinHolidays =   [] -thuringiaHolidays :: DateFinders+thuringiaHolidays :: [Year -> Holiday] thuringiaHolidays =-  [ sep 20 -- world childrens day+  [ hday "worlds_children_day" . sep 20   ]
+ src/Holidays/Mozambique.hs view
@@ -0,0 +1,28 @@+-- references:+-- https://en.wikipedia.org/wiki/Public_holidays_in_Mozambique+{-# LANGUAGE OverloadedStrings #-}++module Holidays.Mozambique (+  holidays,+) where++import Data.Time++import Holidays.Base+import Holidays.DateFinder+import Holidays.DateTransform++holidays :: ([Year -> Holiday], [DateTransform])+holidays =+  ( [ hday "new_years_day" . newYearsDay,+      hday "heroes_day" . feb 3,+      hday "womens_day" . apr 7,+      hday "workers_day" . workersDay,+      hday "independence_day" . jun 25,+      hday "victory_day" . sep 7,+      hday "armed_forces_day" . sep 25,+      hday "day_of_peace_and_reconciliation" . oct 4,+      hday "family_day" . christmasDay+    ],+    []+  )
src/Holidays/Namibia.hs view
@@ -1,29 +1,32 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_Namibia+{-# LANGUAGE OverloadedStrings #-}  module Holidays.Namibia (   holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder-import Holidays.DateTransform+import Holidays.DateTransform (DateTransform, sundayRule) --- Namibia public holidays-holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =-  ( [ newYearsDay,-      mar 21, -- independence day-      goodFriday,-      easterSunday,-      ascensionDay,-      workersDay,-      may 4, -- cassinga day-      may 25, -- africa day-      aug 26, -- heroes day-      dec 10, -- human rights day-      christmasDay,-      boxingDay, -- family day-      years (>= 2025) . may 28 -- genocide remembrance day+  ( [ hday "new_years_day" . newYearsDay,+      hday "independence_day" . mar 21,+      hday "good_friday" . goodFriday,+      hday "easter_sunday" . easterSunday,+      hday "ascension_day" . ascensionDay,+      hday "workers_day" . workersDay,+      hday "cassinga_day" . may 4,+      hday "africa_day" . may 25,+      hday "heroes_day" . aug 26,+      hday "human_rights_day" . dec 10,+      hday "christmas_day" . christmasDay,+      hday "family_day" . boxingDay,+      hday "genocide_remembrance_day" . years (>= 2025) . may 28     ],     [sundayRule]   )
src/Holidays/SouthAfrica.hs view
@@ -1,28 +1,33 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_South_Africa+{-# LANGUAGE OverloadedStrings #-}  module Holidays.SouthAfrica (   holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =-  ( [ newYearsDay,-      goodFriday,-      easterSunday, -- family day-      mar 21, -- human right day-      apr 27, -- freedom day-      workersDay,-      jun 16, -- youth day-      aug 9, -- womens day-      sep 24, -- heritage day-      dec 16, -- day of reconciliation-      christmasDay,-      boxingDay, -- day of goodwill-      years (== 2024) . may 29 -- general elections 2024+  ( [ hday "new_years_day" . newYearsDay,+      hday "good_friday" . goodFriday,+      hday "family_day" . easterSunday,+      hday "human_rights_day" . mar 21,+      hday "freedom_day" . apr 27,+      hday "workers_day" . workersDay,+      hday "youth_day" . jun 16,+      hday "womens_day" . aug 9,+      hday "heritage_day" . sep 24,+      hday "day_of_reconciliation" . dec 16,+      hday "christmas_day" . christmasDay,+      hday "day_of_goodwill" . boxingDay,+      -- special days+      hday "general_elections_2024" . years (== 2024) . may 29     ],     [sundayRule]   )
src/Holidays/UnitedKingdom.hs view
@@ -1,23 +1,27 @@ -- references: -- https://en.wikipedia.org/wiki/Public_holidays_in_the_United_Kingdom+{-# LANGUAGE OverloadedStrings #-}  module Holidays.UnitedKingdom (   holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =-  ( [ newYearsDay,-      goodFriday,-      easterSunday,-      (1 `mon`) . after . may 1, -- early may bank holiday-      (1 `mon`) . before . jun 1, -- spring bank holiday-      (1 `mon`) . before . sep 1, -- summer bank holiday-      christmasDay,-      boxingDay+  ( [ hday "new_years_day" . newYearsDay,+      hday "good_friday" . goodFriday,+      hday "easter_sunday" . easterSunday,+      hday "early_may_bank_holiday" . (1 `mon`) . after . may 1,+      hday "spring_bank_holiday" . (1 `mon`) . before . jun 1,+      hday "summer_bank_holiday" . (1 `mon`) . before . sep 1,+      hday "christmas_day" . christmasDay,+      hday "boxing_day" . boxingDay     ],     [substituteRule]   )
src/Holidays/UnitedStates.hs view
@@ -1,26 +1,30 @@ -- references: -- https://en.wikipedia.org/wiki/Federal_holidays_in_the_United_States+{-# LANGUAGE OverloadedStrings #-}  module Holidays.UnitedStates (   holidays, ) where +import Data.Time++import Holidays.Base import Holidays.DateFinder import Holidays.DateTransform -holidays :: (DateFinders, DateTransforms)+holidays :: ([Year -> Holiday], [DateTransform]) holidays =-  ( [ newYearsDay,-      (3 `mon`) . after . jan 1, -- Martin Luther King's birthday-      (3 `mon`) . after . feb 1, -- Georges Washington's birthday-      (1 `mon`) . before . jun 1, -- memorial day, last monday of may-      jun 19, -- juneteenth independence day-      jul 4, -- independence day-      (1 `mon`) . after . sep 1, -- labor day-      (2 `mon`) . after . oct 1, -- columbus day-      nov 11, -- veterans day,-      (4 `thurs`) . after . nov 1, -- thanksgiving day-      christmasDay+  ( [ hday "new_years_day" . newYearsDay,+      hday "martin_luther_kings_birthday" . (3 `mon`) . after . jan 1,+      hday "george_washingtons_birthday" . (3 `mon`) . after . feb 1,+      hday "memorial_day" . (1 `mon`) . before . jun 1,+      hday "juneteenth_independence_day" . jun 19,+      hday "independence_day" . jul 4,+      hday "labor_day" . (1 `mon`) . after . sep 1,+      hday "columbus_day" . (2 `mon`) . after . oct 1,+      hday "veterans_day" . nov 11,+      hday "thanksgiving_day" . (4 `thurs`) . after . nov 1,+      hday "christmas_day" . christmasDay     ],     []   )
tst/Main.hs view
@@ -1,6 +1,7 @@ module Main where  import Test.Holidays.Germany qualified as DEU+import Test.Holidays.Mozambique qualified as MOZ import Test.Holidays.Namibia qualified as NAM import Test.Holidays.SouthAfrica qualified as ZAF import Test.Holidays.UnitedKingdom qualified as GBR@@ -14,7 +15,7 @@ tests = testGroup "Holidays tests" [unitTests, propTests]  unitTests :: TestTree-unitTests = testGroup "Unit tests" [DEU.unitTests, GBR.unitTests, NAM.unitTests, USA.unitTests, ZAF.unitTests]+unitTests = testGroup "Unit tests" [DEU.unitTests, GBR.unitTests, MOZ.unitTests, NAM.unitTests, USA.unitTests, ZAF.unitTests]  propTests :: TestTree-propTests = testGroup "Holidays property based tests" [DEU.propTests, GBR.propTests, NAM.propTests, USA.propTests, ZAF.propTests]+propTests = testGroup "Holidays property based tests" [DEU.propTests, GBR.propTests, MOZ.propTests, NAM.propTests, USA.propTests, ZAF.propTests]
tst/Test/Holidays.hs view
@@ -18,7 +18,7 @@         S.map           ( \h ->               let-                (year', _, _) = toGregorian h+                (year', _, _) = toGregorian (H.holidayValue h)               in                 year'           )
tst/Test/Holidays/Germany.hs view
@@ -5,6 +5,7 @@   propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -12,35 +13,35 @@ import Test.Tasty.HUnit  -- german states-regions :: [Region] -regions = ["BW","BY","BE","BB","HB","HH","HE","MV","NI","NW","RP","SL","SN","ST","SH","TH"]+regions :: [Region]+regions = ["BW", "BY", "BE", "BB", "HB", "HH", "HE", "MV", "NI", "NW", "RP", "SL", "SN", "ST", "SH", "TH"]  unitTests :: TestTree unitTests =   testGroup     "DEU unit tests"     [ testCase "2025" $-        S.toAscList (holidays "DEU" regions 2025)-          @?= [ day 2025 1 1,-                day 2025 1 6,-                day 2025 3 8,-                day 2025 4 18,-                day 2025 4 20,-                day 2025 4 21,-                day 2025 5 1,-                day 2025 5 8,-                day 2025 5 29,-                day 2025 6 8,-                day 2025 6 9,-                day 2025 6 19,-                day 2025 8 15,-                day 2025 9 20,-                day 2025 10 3,-                day 2025 10 31,-                day 2025 11 1,-                day 2025 11 19,-                day 2025 12 25,-                day 2025 12 26+        sortOn holidayValue (S.toAscList (holidays "DEU" regions 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "epiphany" (day 2025 1 6),+                hday "international_womens_day" (day 2025 3 8),+                hday "good_friday" (day 2025 4 18),+                hday "easter_sunday" (day 2025 4 20),+                hday "easter_monday" (day 2025 4 21),+                hday "labour_day" (day 2025 5 1),+                hday "80th_anniversary_of_end_of_world_war_2" (day 2025 5 8),+                hday "ascension_day" (day 2025 5 29),+                hday "whit_sunday" (day 2025 6 8),+                hday "whit_monday" (day 2025 6 9),+                hday "corpus_christi" (day 2025 6 19),+                hday "assumption_day" (day 2025 8 15),+                hday "worlds_children_day" (day 2025 9 20),+                hday "germany_unity_day" (day 2025 10 3),+                hday "reformation_day" (day 2025 10 31),+                hday "all_saints_day" (day 2025 11 1),+                hday "repentance_and_prayer_day" (day 2025 11 19),+                hday "christmas_day" (day 2025 12 25),+                hday "second_day_of_christmas" (day 2025 12 26)               ]     ] 
+ tst/Test/Holidays/Mozambique.hs view
@@ -0,0 +1,45 @@+{-# LANGUAGE OverloadedStrings #-}++module Test.Holidays.Mozambique (+  unitTests,+  propTests,+) where++import Data.List+import Data.Set qualified as S+import Holidays+import Test.Holidays+import Test.Tasty+import Test.Tasty.HUnit++unitTests :: TestTree+unitTests =+  testGroup+    "MOZ unit tests"+    [ testCase "2025" $+        sortOn holidayValue (S.toList (holidays "MOZ" [] 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "heroes_day" (day 2025 2 3),+                hday "womens_day" (day 2025 4 7),+                hday "workers_day" (day 2025 5 1),+                hday "independence_day" (day 2025 6 25),+                hday "victory_day" (day 2025 9 7),+                hday "armed_forces_day" (day 2025 9 25),+                hday "day_of_peace_and_reconciliation" (day 2025 10 4),+                hday "family_day" (day 2025 12 25)+              ]+    ]++propTests :: TestTree+propTests = countryPropTests "MOZ" []++{-+ ( [ hday "new_years_day" . newYearsDay,+      hday "heroes_day" . feb 3,+      hday "womens_day" . apr 7,+      hday "workers_day" . workersDay,+      hday "independence_day" . jun 25,+      hday "victory_day" . sep 7,+      hday "armed_forces_day" . sep 25,+      hday "day_of_peace_and_reconciliation" . oct 4,+      hday "family_day" . christmasDay -}
tst/Test/Holidays/Namibia.hs view
@@ -5,6 +5,7 @@   propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,35 +17,35 @@   testGroup     "NAM unit tests"     [ testCase "2024" $-        S.toAscList (holidays "NAM" [] 2024)-          @?= [ day 2024 1 1,-                day 2024 3 21,-                day 2024 3 29,-                day 2024 4 1,-                day 2024 5 1,-                day 2024 5 4,-                day 2024 5 9,-                day 2024 5 25,-                day 2024 8 26,-                day 2024 12 10,-                day 2024 12 25,-                day 2024 12 26+        sortOn holidayValue (S.toAscList (holidays "NAM" [] 2024))+          @?= [ hday "new_years_day" (day 2024 1 1),+                hday "independence_day" (day 2024 3 21),+                hday "good_friday" (day 2024 3 29),+                hday "easter_sunday" (day 2024 4 1),+                hday "workers_day" (day 2024 5 1),+                hday "cassinga_day" (day 2024 5 4),+                hday "ascension_day" (day 2024 5 9),+                hday "africa_day" (day 2024 5 25),+                hday "heroes_day" (day 2024 8 26),+                hday "human_rights_day" (day 2024 12 10),+                hday "christmas_day" (day 2024 12 25),+                hday "family_day" (day 2024 12 26)               ],       testCase "2025" $-        S.toAscList (holidays "NAM" [] 2025)-          @?= [ day 2025 1 1,-                day 2025 3 21,-                day 2025 4 18,-                day 2025 4 21,-                day 2025 5 1,-                day 2025 5 5,-                day 2025 5 26,-                day 2025 5 28,-                day 2025 5 29,-                day 2025 8 26,-                day 2025 12 10,-                day 2025 12 25,-                day 2025 12 26+        sortOn holidayValue (S.toAscList (holidays "NAM" [] 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "independence_day" (day 2025 3 21),+                hday "good_friday" (day 2025 4 18),+                hday "easter_sunday" (day 2025 4 21),+                hday "workers_day" (day 2025 5 1),+                hday "cassinga_day" (day 2025 5 5),+                hday "africa_day" (day 2025 5 26),+                hday "genocide_remembrance_day" (day 2025 5 28),+                hday "ascension_day" (day 2025 5 29),+                hday "heroes_day" (day 2025 8 26),+                hday "human_rights_day" (day 2025 12 10),+                hday "christmas_day" (day 2025 12 25),+                hday "family_day" (day 2025 12 26)               ]     ] 
tst/Test/Holidays/SouthAfrica.hs view
@@ -5,6 +5,7 @@   propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,35 +17,35 @@   testGroup     "ZAF unit tests"     [ testCase "2024" $-        S.toAscList (holidays "ZAF" [] 2024)-          @?= [ day 2024 1 1,-                day 2024 3 21,-                day 2024 3 29,-                day 2024 4 1,-                day 2024 4 27,-                day 2024 5 1,-                day 2024 5 29,-                day 2024 6 17,-                day 2024 8 9,-                day 2024 9 24,-                day 2024 12 16,-                day 2024 12 25,-                day 2024 12 26+        sortOn holidayValue (S.toAscList (holidays "ZAF" [] 2024))+          @?= [ hday "new_years_day" (day 2024 1 1),+                hday "human_rights_day" (day 2024 3 21),+                hday "good_friday" (day 2024 3 29),+                hday "family_day" (day 2024 4 1),+                hday "freedom_day" (day 2024 4 27),+                hday "workers_day" (day 2024 5 1),+                hday "general_elections_2024" (day 2024 5 29),+                hday "youth_day" (day 2024 6 17),+                hday "womens_day" (day 2024 8 9),+                hday "heritage_day" (day 2024 9 24),+                hday "day_of_reconciliation" (day 2024 12 16),+                hday "christmas_day" (day 2024 12 25),+                hday "day_of_goodwill" (day 2024 12 26)               ],       testCase "2025" $-        S.toAscList (holidays "ZAF" [] 2025)-          @?= [ day 2025 1 1,-                day 2025 3 21,-                day 2025 4 18,-                day 2025 4 21,-                day 2025 4 28,-                day 2025 5 1,-                day 2025 6 16,-                day 2025 8 9,-                day 2025 9 24,-                day 2025 12 16,-                day 2025 12 25,-                day 2025 12 26+        sortOn holidayValue (S.toList (holidays "ZAF" [] 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "human_rights_day" (day 2025 3 21),+                hday "good_friday" (day 2025 4 18),+                hday "family_day" (day 2025 4 21),+                hday "freedom_day" (day 2025 4 28),+                hday "workers_day" (day 2025 5 1),+                hday "youth_day" (day 2025 6 16),+                hday "womens_day" (day 2025 8 9),+                hday "heritage_day" (day 2025 9 24),+                hday "day_of_reconciliation" (day 2025 12 16),+                hday "christmas_day" (day 2025 12 25),+                hday "day_of_goodwill" (day 2025 12 26)               ]     ] 
tst/Test/Holidays/UnitedKingdom.hs view
@@ -5,6 +5,7 @@   propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,26 +17,26 @@   testGroup     "GBR unit tests"     [ testCase "2025" $-        S.toAscList (holidays "GBR" [] 2025)-          @?= [ day 2025 1 1,-                day 2025 4 18,-                day 2025 4 21,-                day 2025 5 5,-                day 2025 5 26,-                day 2025 8 25,-                day 2025 12 25,-                day 2025 12 26+        sortOn holidayValue (S.toList (holidays "GBR" [] 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "good_friday" (day 2025 4 18),+                hday "easter_sunday" (day 2025 4 21),+                hday "early_may_bank_holiday" (day 2025 5 5),+                hday "spring_bank_holiday" (day 2025 5 26),+                hday "summer_bank_holiday" (day 2025 8 25),+                hday "christmas_day" (day 2025 12 25),+                hday "boxing_day" (day 2025 12 26)               ],       testCase "2026" $-        S.toAscList (holidays "GBR" [] 2026)-          @?= [ day 2026 1 1,-                day 2026 4 3,-                day 2026 4 6,-                day 2026 5 4,-                day 2026 5 25,-                day 2026 8 31,-                day 2026 12 25,-                day 2026 12 28+        sortOn holidayValue (S.toList (holidays "GBR" [] 2026))+          @?= [ hday "new_years_day" (day 2026 1 1),+                hday "good_friday" (day 2026 4 3),+                hday "easter_sunday" (day 2026 4 6),+                hday "early_may_bank_holiday" (day 2026 5 4),+                hday "spring_bank_holiday" (day 2026 5 25),+                hday "summer_bank_holiday" (day 2026 8 31),+                hday "christmas_day" (day 2026 12 25),+                hday "boxing_day" (day 2026 12 28)               ]     ] 
tst/Test/Holidays/UnitedStates.hs view
@@ -5,6 +5,7 @@   propTests, ) where +import Data.List import Data.Set qualified as S import Holidays import Test.Holidays@@ -16,18 +17,18 @@   testGroup     "USA unit tests"     [ testCase "2025" $-        S.toAscList (holidays "USA" [] 2025)-          @?= [ day 2025 1 1,-                day 2025 1 20,-                day 2025 2 17,-                day 2025 5 26,-                day 2025 6 19,-                day 2025 7 4,-                day 2025 9 1,-                day 2025 10 13,-                day 2025 11 11,-                day 2025 11 27,-                day 2025 12 25+        sortOn holidayValue (S.toAscList (holidays "USA" [] 2025))+          @?= [ hday "new_years_day" (day 2025 1 1),+                hday "martin_luther_kings_birthday" (day 2025 1 20),+                hday "george_washingtons_birthday" (day 2025 2 17),+                hday "memorial_day" (day 2025 5 26),+                hday "juneteenth_independence_day" (day 2025 6 19),+                hday "independence_day" (day 2025 7 4),+                hday "labor_day" (day 2025 9 1),+                hday "columbus_day" (day 2025 10 13),+                hday "veterans_day" (day 2025 11 11),+                hday "thanksgiving_day" (day 2025 11 27),+                hday "christmas_day" (day 2025 12 25)               ]     ]