module Data.Thyme.Calendar.OrdinalDate
( Year, isLeapYear
, DayOfYear, OrdinalDate (..), ordinalDate
, module Data.Thyme.Calendar.OrdinalDate
) where
import Prelude
import Control.Applicative
import Control.Lens
import Control.Monad
import Data.Thyme.Calendar.Internal
import Data.Thyme.TH
fromOrdinalDateValid :: OrdinalDate -> Maybe Day
fromOrdinalDateValid od@(OrdinalDate y d) = review ordinalDate od
<$ guard (1 <= d && d <= if isLeapYear y then 366 else 365)
sundayStartWeek :: Day -> WeekDate
sundayStartWeek day@(ModifiedJulianDay mjd) = WeekDate y
(fromIntegral $ div d 7 div k 7) (fromIntegral $ mod d 7) where
OrdinalDate y yd = view ordinalDate day
d = mjd + 3
k = d fromIntegral yd
fromSundayStartWeekValid :: WeekDate -> Maybe Day
fromSundayStartWeekValid wd@(WeekDate y w d) = fromWeekMax wMax wd
<$ guard (0 <= d && d <= 6 && 0 <= w && w <= wMax) where
WeekDate _ wMax _ = view (from ordinalDate . weekDate) (OrdinalDate y 365)
mondayStartWeek :: Day -> WeekDate
mondayStartWeek day@(ModifiedJulianDay mjd) = WeekDate y
(fromIntegral $ div d 7 div k 7) (fromIntegral $ mod d 7 + 1) where
OrdinalDate y yd = view ordinalDate day
d = mjd + 2
k = d fromIntegral yd
fromMondayStartWeekValid :: WeekDate -> Maybe Day
fromMondayStartWeekValid wd@(WeekDate y w d) = fromWeekMax wMax wd
<$ guard (1 <= d && d <= 7 && 0 <= w && w <= wMax) where
WeekDate _ wMax _ = view (from ordinalDate . weekDate) (OrdinalDate y 365)
thymeLenses ''OrdinalDate