{-# LANGUAGE CPP #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE ViewPatterns #-}

#include "thyme.h"

-- | Calendar months and day-of-months.
module Data.Thyme.Calendar.MonthDay
    ( Month, DayOfMonth
    , MonthDay (..), _mdMonth, _mdDay
    , monthDay, monthDayValid, monthLength
    , module Data.Thyme.Calendar.MonthDay
    ) where

import Prelude
import Control.Lens
import Data.Thyme.Calendar.Internal

-- * Compatibility

-- | Predicated on whether or not it is a leap year, convert an ordinal
-- 'DayOfYear' to its corresponding 'Month' and 'DayOfMonth'.
--
-- @
-- 'dayOfYearToMonthAndDay' leap ('view' ('monthDay' leap) -> 'MonthDay' m d) = (m, d)
-- @
{-# INLINE dayOfYearToMonthAndDay #-}
dayOfYearToMonthAndDay
    :: Bool -- ^ 'isLeapYear'?
    -> DayOfYear
    -> (Month, DayOfMonth)
dayOfYearToMonthAndDay :: Bool -> DayOfYear -> (DayOfYear, DayOfYear)
dayOfYearToMonthAndDay Bool
leap (forall a s. Getting a s a -> s -> a
view (Bool -> Iso' DayOfYear MonthDay
monthDay Bool
leap) -> MonthDay DayOfYear
m DayOfYear
d) = (DayOfYear
m, DayOfYear
d)

-- | Predicated on whether or not it is a leap year, convert a 'Month' and
-- 'DayOfMonth' to its corresponding ordinal 'DayOfYear'.
-- Does not validate the input.
--
-- @
-- 'monthAndDayToDayOfYear' leap m d = 'monthDay' leap 'Control.Lens.#' 'MonthDay' m d
-- @
{-# INLINE monthAndDayToDayOfYear #-}
monthAndDayToDayOfYear
    :: Bool -- ^ 'isLeapYear'?
    -> Month
    -> DayOfMonth
    -> DayOfYear
monthAndDayToDayOfYear :: Bool -> DayOfYear -> DayOfYear -> DayOfYear
monthAndDayToDayOfYear Bool
leap DayOfYear
m DayOfYear
d = Bool -> Iso' DayOfYear MonthDay
monthDay Bool
leap forall s t a b. AReview s t a b -> b -> t
# DayOfYear -> DayOfYear -> MonthDay
MonthDay DayOfYear
m DayOfYear
d

-- | Predicated on whether or not it is a leap year, convert a 'Month' and
-- 'DayOfMonth' to its corresponding ordinal 'DayOfYear'.
-- Returns 'Nothing' for invalid input.
--
-- @
-- 'monthAndDayToDayOfYearValid' leap m d = 'monthDayValid' leap ('MonthDay' m d)
-- @
{-# INLINE monthAndDayToDayOfYearValid #-}
monthAndDayToDayOfYearValid
    :: Bool -- ^ 'isLeapYear'?
    -> Month
    -> DayOfMonth
    -> Maybe DayOfYear
monthAndDayToDayOfYearValid :: Bool -> DayOfYear -> DayOfYear -> Maybe DayOfYear
monthAndDayToDayOfYearValid Bool
leap DayOfYear
m DayOfYear
d = Bool -> MonthDay -> Maybe DayOfYear
monthDayValid Bool
leap (DayOfYear -> DayOfYear -> MonthDay
MonthDay DayOfYear
m DayOfYear
d)