{-# LANGUAGE CPP #-} #if __GLASGOW_HASKELL__ >= 710 {-# LANGUAGE PatternSynonyms #-} {-# LANGUAGE ViewPatterns #-} #endif module Data.Time.Calendar.OrdinalDate.Compat ( Day, Year, DayOfYear, WeekOfYear, toOrdinalDate, fromOrdinalDate, #if __GLASGOW_HASKELL__ >= 710 pattern YearDay, #endif fromOrdinalDateValid, showOrdinalDate, isLeapYear, mondayStartWeek, sundayStartWeek, fromMondayStartWeek, fromMondayStartWeekValid, fromSundayStartWeek, fromSundayStartWeekValid, ) where import Data.Time.Orphans () import Data.Time.Calendar.OrdinalDate hiding (fromSundayStartWeekValid) #if MIN_VERSION_time(1,6,0) import Data.Time.Calendar.OrdinalDate (fromSundayStartWeekValid) #else import Data.Time.Calendar.Private #endif #if !MIN_VERSION_time(1,11,0) import Data.Time.Calendar import Data.Time.Calendar.Types #endif #if !MIN_VERSION_time(1,11,0) #if __GLASGOW_HASKELL__ >= 710 -- | Bidirectional abstract constructor for ISO 8601 Ordinal Date format. -- Invalid day numbers will be clipped to the correct range (1 to 365 or 366). pattern YearDay :: Year -> DayOfYear -> Day pattern YearDay y d <- (toOrdinalDate -> (y,d)) where YearDay y d = fromOrdinalDate y d #if __GLASGOW_HASKELL__ >= 802 {-# COMPLETE YearDay #-} #endif #endif #endif #if !MIN_VERSION_time(1,6,0) fromSundayStartWeekValid :: Year -- ^ Year. -> WeekOfYear -- ^ Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime'). -> Int -- ^ Day of week. -- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime'). -> Maybe Day fromSundayStartWeekValid year w d = do d' <- clipValid 0 6 d let -- first day of the year firstDay = fromOrdinalDate year 1 -- 0-based week of year zbFirstSunday = (4 - toModifiedJulianDay firstDay) `mod` 7 -- 0-based week number zbWeek = w - 1 -- 0-based day of week zbDay = d' -- 0-based day in year zbYearDay = zbFirstSunday + 7 * toInteger zbWeek + toInteger zbDay zbYearDay' <- clipValid 0 (if isLeapYear year then 365 else 364) zbYearDay return $ addDays zbYearDay' firstDay #endif