time-compat-1.9.4: src/Data/Time/Calendar/OrdinalDate/Compat.hs
{-# 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