1{-# LANGUAGE CPP #-} 2#if __GLASGOW_HASKELL__ >= 710 3{-# LANGUAGE PatternSynonyms #-} 4{-# LANGUAGE ViewPatterns #-} 5#endif 6module Data.Time.Calendar.OrdinalDate.Compat ( 7 Day, Year, DayOfYear, WeekOfYear, 8 toOrdinalDate, 9 fromOrdinalDate, 10#if __GLASGOW_HASKELL__ >= 710 11 pattern YearDay, 12#endif 13 fromOrdinalDateValid, 14 showOrdinalDate, 15 isLeapYear, 16 mondayStartWeek, 17 sundayStartWeek, 18 fromMondayStartWeek, 19 fromMondayStartWeekValid, 20 fromSundayStartWeek, 21 fromSundayStartWeekValid, 22) where 23 24import Data.Time.Orphans () 25 26import Data.Time.Calendar.OrdinalDate hiding (fromSundayStartWeekValid) 27#if MIN_VERSION_time(1,6,0) 28import Data.Time.Calendar.OrdinalDate (fromSundayStartWeekValid) 29#else 30import Data.Time.Calendar.Private 31#endif 32 33#if !MIN_VERSION_time(1,11,0) 34import Data.Time.Calendar 35import Data.Time.Calendar.Types 36#endif 37 38#if !MIN_VERSION_time(1,11,0) 39 40#if __GLASGOW_HASKELL__ >= 710 41-- | Bidirectional abstract constructor for ISO 8601 Ordinal Date format. 42-- Invalid day numbers will be clipped to the correct range (1 to 365 or 366). 43pattern YearDay :: Year -> DayOfYear -> Day 44pattern YearDay y d <- (toOrdinalDate -> (y,d)) where 45 YearDay y d = fromOrdinalDate y d 46 47#if __GLASGOW_HASKELL__ >= 802 48{-# COMPLETE YearDay #-} 49#endif 50#endif 51 52#endif 53 54#if !MIN_VERSION_time(1,6,0) 55fromSundayStartWeekValid :: 56 Year -- ^ Year. 57 -> WeekOfYear -- ^ Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime'). 58 -> Int -- ^ Day of week. 59 -- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime'). 60 -> Maybe Day 61fromSundayStartWeekValid year w d = do 62 d' <- clipValid 0 6 d 63 let 64 -- first day of the year 65 firstDay = fromOrdinalDate year 1 66 -- 0-based week of year 67 zbFirstSunday = (4 - toModifiedJulianDay firstDay) `mod` 7 68 -- 0-based week number 69 zbWeek = w - 1 70 -- 0-based day of week 71 zbDay = d' 72 -- 0-based day in year 73 zbYearDay = zbFirstSunday + 7 * toInteger zbWeek + toInteger zbDay 74 zbYearDay' <- 75 clipValid 76 0 77 (if isLeapYear year 78 then 365 79 else 364) 80 zbYearDay 81 return $ addDays zbYearDay' firstDay 82#endif 83