@@ -0,0 +1,28 @@
1+{-# OPTIONS -Wno-orphans #-}
2+{-# LANGUAGE DeriveLift #-}
4+module Holidays.EDay (EDay, eDayToDay) where
6+import Data.ByteString.Char8
9+import Data.Time.Calendar.OrdinalDate
10+import Data.Vector qualified as V
11+import Language.Haskell.TH.Lift
13+data EDay = EDay {edYear :: Integer, edDay :: Int}
14+ deriving stock (Eq,Ord,Show,Lift)
16+eDayToDay :: EDay -> Day
17+eDayToDay (EDay y d) = fromOrdinalDate y d
19+instance FromField EDay where
20+ parseField f = mkEDay <$> parseTimeM False defaultTimeLocale (iso8601DateFormat Nothing) (unpack f)
21+ where mkEDay d = let (theYear,theDay) = toOrdinalDate d in EDay theYear theDay
23+instance FromRecord EDay where
25+ | n == 1 = unsafeIndex v 0
26+ | otherwise = fail "Expected single field for a day"