{-# LANGUAGE Safe #-}-- | ISO 8601 Ordinal Date formatmoduleData.Time.Calendar.OrdinalDate(Day ,Year ,DayOfYear ,WeekOfYear ,moduleData.Time.Calendar.OrdinalDate )whereimportData.Time.Calendar.Days importData.Time.Calendar.Private importData.Time.Calendar.Types -- | Convert to ISO 8601 Ordinal Date format.toOrdinalDate ::Day ->(Year ,DayOfYear )toOrdinalDate :: Day -> (Year, DayOfYear) toOrdinalDate (ModifiedJulianDay Year mjd )=(Year year ,DayOfYear yd )wherea :: Year a =Year mjd Year -> Year -> Year forall a. Num a => a -> a -> a +Year 678575quadcent :: Year quadcent =Year -> Year -> Year forall a. Integral a => a -> a -> a divYear a Year 146097b :: Year b =Year -> Year -> Year forall a. Integral a => a -> a -> a modYear a Year 146097cent :: Year cent =Year -> Year -> Year forall a. Ord a => a -> a -> a min(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear b Year 36524)Year 3c :: Year c =Year b Year -> Year -> Year forall a. Num a => a -> a -> a -(Year cent Year -> Year -> Year forall a. Num a => a -> a -> a *Year 36524)quad :: Year quad =Year -> Year -> Year forall a. Integral a => a -> a -> a divYear c Year 1461d :: Year d =Year -> Year -> Year forall a. Integral a => a -> a -> a modYear c Year 1461y :: Year y =Year -> Year -> Year forall a. Ord a => a -> a -> a min(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear d Year 365)Year 3yd :: DayOfYear yd =Year -> DayOfYear forall a. Num a => Year -> a fromInteger(Year d Year -> Year -> Year forall a. Num a => a -> a -> a -(Year y Year -> Year -> Year forall a. Num a => a -> a -> a *Year 365)Year -> Year -> Year forall a. Num a => a -> a -> a +Year 1)year :: Year year =Year quadcent Year -> Year -> Year forall a. Num a => a -> a -> a *Year 400Year -> Year -> Year forall a. Num a => a -> a -> a +Year cent Year -> Year -> Year forall a. Num a => a -> a -> a *Year 100Year -> Year -> Year forall a. Num a => a -> a -> a +Year quad Year -> Year -> Year forall a. Num a => a -> a -> a *Year 4Year -> Year -> Year forall a. Num a => a -> a -> a +Year y Year -> Year -> Year forall a. Num a => a -> a -> a +Year 1-- | Convert from ISO 8601 Ordinal Date format.-- Invalid day numbers will be clipped to the correct range (1 to 365 or 366).fromOrdinalDate ::Year ->DayOfYear ->Day fromOrdinalDate :: Year -> DayOfYear -> Day fromOrdinalDate Year year DayOfYear day =Year -> Day ModifiedJulianDay Year mjd wherey :: Year y =Year year Year -> Year -> Year forall a. Num a => a -> a -> a -Year 1mjd :: Year mjd =(DayOfYear -> Year forall a b. (Integral a, Num b) => a -> b fromIntegral(DayOfYear -> DayOfYear -> DayOfYear -> DayOfYear forall t. Ord t => t -> t -> t -> t clip DayOfYear 1(ifYear -> Bool isLeapYear Year year thenDayOfYear 366elseDayOfYear 365)DayOfYear day ))Year -> Year -> Year forall a. Num a => a -> a -> a +(Year 365Year -> Year -> Year forall a. Num a => a -> a -> a *Year y )Year -> Year -> Year forall a. Num a => a -> a -> a +(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 4)Year -> Year -> Year forall a. Num a => a -> a -> a -(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 100)Year -> Year -> Year forall a. Num a => a -> a -> a +(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 400)Year -> Year -> Year forall a. Num a => a -> a -> a -Year 678576-- | Bidirectional abstract constructor for ISO 8601 Ordinal Date format.-- Invalid day numbers will be clipped to the correct range (1 to 365 or 366).patternYearDay ::Year ->DayOfYear ->Day pattern$bYearDay :: Year -> DayOfYear -> Day $mYearDay :: forall r. Day -> (Year -> DayOfYear -> r) -> (Void# -> r) -> r YearDay y d <-(toOrdinalDate ->(y ,d ))whereYearDay Year y DayOfYear d =Year -> DayOfYear -> Day fromOrdinalDate Year y DayOfYear d {-# COMPLETEYearDay #-}-- | Convert from ISO 8601 Ordinal Date format.-- Invalid day numbers return 'Nothing'fromOrdinalDateValid ::Year ->DayOfYear ->MaybeDay fromOrdinalDateValid :: Year -> DayOfYear -> Maybe Day fromOrdinalDateValid Year year DayOfYear day =doDayOfYear day' <-DayOfYear -> DayOfYear -> DayOfYear -> Maybe DayOfYear forall t. Ord t => t -> t -> t -> Maybe t clipValid DayOfYear 1(ifYear -> Bool isLeapYear Year year thenDayOfYear 366elseDayOfYear 365)DayOfYear day lety :: Year y =Year year Year -> Year -> Year forall a. Num a => a -> a -> a -Year 1mjd :: Year mjd =(DayOfYear -> Year forall a b. (Integral a, Num b) => a -> b fromIntegralDayOfYear day' )Year -> Year -> Year forall a. Num a => a -> a -> a +(Year 365Year -> Year -> Year forall a. Num a => a -> a -> a *Year y )Year -> Year -> Year forall a. Num a => a -> a -> a +(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 4)Year -> Year -> Year forall a. Num a => a -> a -> a -(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 100)Year -> Year -> Year forall a. Num a => a -> a -> a +(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear y Year 400)Year -> Year -> Year forall a. Num a => a -> a -> a -Year 678576Day -> Maybe Day forall (m :: * -> *) a. Monad m => a -> m a return(Year -> Day ModifiedJulianDay Year mjd )-- | Show in ISO 8601 Ordinal Date format (yyyy-ddd)showOrdinalDate ::Day ->StringshowOrdinalDate :: Day -> String showOrdinalDate Day date =(Year -> String forall t. ShowPadded t => t -> String show4 Year y )String -> String -> String forall a. [a] -> [a] -> [a] ++String "-"String -> String -> String forall a. [a] -> [a] -> [a] ++(DayOfYear -> String forall t. ShowPadded t => t -> String show3 DayOfYear d )where(Year y ,DayOfYear d )=Day -> (Year, DayOfYear) toOrdinalDate Day date -- | Is this year a leap year according to the proleptic Gregorian calendar?isLeapYear ::Year ->BoolisLeapYear :: Year -> Bool isLeapYear Year year =(Year -> Year -> Year forall a. Integral a => a -> a -> a modYear year Year 4Year -> Year -> Bool forall a. Eq a => a -> a -> Bool ==Year 0)Bool -> Bool -> Bool &&((Year -> Year -> Year forall a. Integral a => a -> a -> a modYear year Year 400Year -> Year -> Bool forall a. Eq a => a -> a -> Bool ==Year 0)Bool -> Bool -> Bool ||Bool -> Bool not(Year -> Year -> Year forall a. Integral a => a -> a -> a modYear year Year 100Year -> Year -> Bool forall a. Eq a => a -> a -> Bool ==Year 0))-- | Get the number of the Monday-starting week in the year and the day of the week.-- The first Monday is the first day of week 1, any earlier days in the year are week 0 (as @%W@ in 'Data.Time.Format.formatTime').-- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime').mondayStartWeek ::Day ->(WeekOfYear ,Int)mondayStartWeek :: Day -> (DayOfYear, DayOfYear) mondayStartWeek Day date =(Year -> DayOfYear forall a. Num a => Year -> a fromInteger((Year -> Year -> Year forall a. Integral a => a -> a -> a divYear d Year 7)Year -> Year -> Year forall a. Num a => a -> a -> a -(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear k Year 7)),Year -> DayOfYear forall a. Num a => Year -> a fromInteger(Year -> Year -> Year forall a. Integral a => a -> a -> a modYear d Year 7)DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a +DayOfYear 1)whereyd :: DayOfYear yd =(Year, DayOfYear) -> DayOfYear forall a b. (a, b) -> b snd(Day -> (Year, DayOfYear) toOrdinalDate Day date )d :: Year d =(Day -> Year toModifiedJulianDay Day date )Year -> Year -> Year forall a. Num a => a -> a -> a +Year 2k :: Year k =Year d Year -> Year -> Year forall a. Num a => a -> a -> a -(DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear yd )-- | Get the number of the Sunday-starting week in the year and the day of the week.-- The first Sunday is the first day of week 1, any earlier days in the year are week 0 (as @%U@ in 'Data.Time.Format.formatTime').-- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime').sundayStartWeek ::Day ->(WeekOfYear ,Int)sundayStartWeek :: Day -> (DayOfYear, DayOfYear) sundayStartWeek Day date =(Year -> DayOfYear forall a. Num a => Year -> a fromInteger((Year -> Year -> Year forall a. Integral a => a -> a -> a divYear d Year 7)Year -> Year -> Year forall a. Num a => a -> a -> a -(Year -> Year -> Year forall a. Integral a => a -> a -> a divYear k Year 7)),Year -> DayOfYear forall a. Num a => Year -> a fromInteger(Year -> Year -> Year forall a. Integral a => a -> a -> a modYear d Year 7))whereyd :: DayOfYear yd =(Year, DayOfYear) -> DayOfYear forall a b. (a, b) -> b snd(Day -> (Year, DayOfYear) toOrdinalDate Day date )d :: Year d =(Day -> Year toModifiedJulianDay Day date )Year -> Year -> Year forall a. Num a => a -> a -> a +Year 3k :: Year k =Year d Year -> Year -> Year forall a. Num a => a -> a -> a -(DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear yd )-- | The inverse of 'mondayStartWeek'. Get a 'Day' given the year,-- the number of the Monday-starting week, and the day of the week.-- The first Monday is the first day of week 1, any earlier days in the year-- are week 0 (as @%W@ in 'Data.Time.Format.formatTime').fromMondayStartWeek ::-- | Year.Year ->-- | Monday-starting week number (as @%W@ in 'Data.Time.Format.formatTime').WeekOfYear ->-- | Day of week.-- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime').Int->Day fromMondayStartWeek :: Year -> DayOfYear -> DayOfYear -> Day fromMondayStartWeek Year year DayOfYear w DayOfYear d =let-- first day of the yearfirstDay :: Day firstDay =Year -> DayOfYear -> Day fromOrdinalDate Year year DayOfYear 1-- 0-based year day of first monday of the yearzbFirstMonday :: Year zbFirstMonday =(Year 5Year -> Year -> Year forall a. Num a => a -> a -> a -Day -> Year toModifiedJulianDay Day firstDay )Year -> Year -> Year forall a. Integral a => a -> a -> a `mod`Year 7-- 0-based week of yearzbWeek :: DayOfYear zbWeek =DayOfYear w DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day of weekzbDay :: DayOfYear zbDay =DayOfYear d DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day in yearzbYearDay :: Year zbYearDay =Year zbFirstMonday Year -> Year -> Year forall a. Num a => a -> a -> a +Year 7Year -> Year -> Year forall a. Num a => a -> a -> a *DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbWeek Year -> Year -> Year forall a. Num a => a -> a -> a +DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbDay inYear -> Day -> Day addDays Year zbYearDay Day firstDay fromMondayStartWeekValid ::-- | Year.Year ->-- | Monday-starting week number (as @%W@ in 'Data.Time.Format.formatTime').WeekOfYear ->-- | Day of week.-- Monday is 1, Sunday is 7 (as @%u@ in 'Data.Time.Format.formatTime').Int->MaybeDay fromMondayStartWeekValid :: Year -> DayOfYear -> DayOfYear -> Maybe Day fromMondayStartWeekValid Year year DayOfYear w DayOfYear d =doDayOfYear d' <-DayOfYear -> DayOfYear -> DayOfYear -> Maybe DayOfYear forall t. Ord t => t -> t -> t -> Maybe t clipValid DayOfYear 1DayOfYear 7DayOfYear d let-- first day of the yearfirstDay :: Day firstDay =Year -> DayOfYear -> Day fromOrdinalDate Year year DayOfYear 1-- 0-based week of yearzbFirstMonday :: Year zbFirstMonday =(Year 5Year -> Year -> Year forall a. Num a => a -> a -> a -Day -> Year toModifiedJulianDay Day firstDay )Year -> Year -> Year forall a. Integral a => a -> a -> a `mod`Year 7-- 0-based week numberzbWeek :: DayOfYear zbWeek =DayOfYear w DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day of weekzbDay :: DayOfYear zbDay =DayOfYear d' DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day in yearzbYearDay :: Year zbYearDay =Year zbFirstMonday Year -> Year -> Year forall a. Num a => a -> a -> a +Year 7Year -> Year -> Year forall a. Num a => a -> a -> a *DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbWeek Year -> Year -> Year forall a. Num a => a -> a -> a +DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbDay Year zbYearDay' <-Year -> Year -> Year -> Maybe Year forall t. Ord t => t -> t -> t -> Maybe t clipValid Year 0(ifYear -> Bool isLeapYear Year year thenYear 365elseYear 364)Year zbYearDay Day -> Maybe Day forall (m :: * -> *) a. Monad m => a -> m a return(Day -> Maybe Day) -> Day -> Maybe Day forall a b. (a -> b) -> a -> b $Year -> Day -> Day addDays Year zbYearDay' Day firstDay -- | The inverse of 'sundayStartWeek'. Get a 'Day' given the year and-- the number of the day of a Sunday-starting week.-- The first Sunday is the first day of week 1, any earlier days in the-- year are week 0 (as @%U@ in 'Data.Time.Format.formatTime').fromSundayStartWeek ::-- | Year.Year ->-- | Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime').WeekOfYear ->-- | Day of week-- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime').Int->Day fromSundayStartWeek :: Year -> DayOfYear -> DayOfYear -> Day fromSundayStartWeek Year year DayOfYear w DayOfYear d =let-- first day of the yearfirstDay :: Day firstDay =Year -> DayOfYear -> Day fromOrdinalDate Year year DayOfYear 1-- 0-based year day of first monday of the yearzbFirstSunday :: Year zbFirstSunday =(Year 4Year -> Year -> Year forall a. Num a => a -> a -> a -Day -> Year toModifiedJulianDay Day firstDay )Year -> Year -> Year forall a. Integral a => a -> a -> a `mod`Year 7-- 0-based week of yearzbWeek :: DayOfYear zbWeek =DayOfYear w DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day of weekzbDay :: DayOfYear zbDay =DayOfYear d -- 0-based day in yearzbYearDay :: Year zbYearDay =Year zbFirstSunday Year -> Year -> Year forall a. Num a => a -> a -> a +Year 7Year -> Year -> Year forall a. Num a => a -> a -> a *DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbWeek Year -> Year -> Year forall a. Num a => a -> a -> a +DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbDay inYear -> Day -> Day addDays Year zbYearDay Day firstDay fromSundayStartWeekValid ::-- | Year.Year ->-- | Sunday-starting week number (as @%U@ in 'Data.Time.Format.formatTime').WeekOfYear ->-- | Day of week.-- Sunday is 0, Saturday is 6 (as @%w@ in 'Data.Time.Format.formatTime').Int->MaybeDay fromSundayStartWeekValid :: Year -> DayOfYear -> DayOfYear -> Maybe Day fromSundayStartWeekValid Year year DayOfYear w DayOfYear d =doDayOfYear d' <-DayOfYear -> DayOfYear -> DayOfYear -> Maybe DayOfYear forall t. Ord t => t -> t -> t -> Maybe t clipValid DayOfYear 0DayOfYear 6DayOfYear d let-- first day of the yearfirstDay :: Day firstDay =Year -> DayOfYear -> Day fromOrdinalDate Year year DayOfYear 1-- 0-based week of yearzbFirstSunday :: Year zbFirstSunday =(Year 4Year -> Year -> Year forall a. Num a => a -> a -> a -Day -> Year toModifiedJulianDay Day firstDay )Year -> Year -> Year forall a. Integral a => a -> a -> a `mod`Year 7-- 0-based week numberzbWeek :: DayOfYear zbWeek =DayOfYear w DayOfYear -> DayOfYear -> DayOfYear forall a. Num a => a -> a -> a -DayOfYear 1-- 0-based day of weekzbDay :: DayOfYear zbDay =DayOfYear d' -- 0-based day in yearzbYearDay :: Year zbYearDay =Year zbFirstSunday Year -> Year -> Year forall a. Num a => a -> a -> a +Year 7Year -> Year -> Year forall a. Num a => a -> a -> a *DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbWeek Year -> Year -> Year forall a. Num a => a -> a -> a +DayOfYear -> Year forall a. Integral a => a -> Year toIntegerDayOfYear zbDay Year zbYearDay' <-Year -> Year -> Year -> Maybe Year forall t. Ord t => t -> t -> t -> Maybe t clipValid Year 0(ifYear -> Bool isLeapYear Year year thenYear 365elseYear 364)Year zbYearDay Day -> Maybe Day forall (m :: * -> *) a. Monad m => a -> m a return(Day -> Maybe Day) -> Day -> Maybe Day forall a b. (a -> b) -> a -> b $Year -> Day -> Day addDays Year zbYearDay' Day firstDay