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