module Data.Thyme.Calendar.MonthDay
( Month, DayOfMonth
, module Data.Thyme.Calendar.MonthDay
) where
import Prelude
import Control.Applicative
import Control.DeepSeq
import Control.Lens
import Control.Monad
import Data.Data
import qualified Data.Time.Calendar.MonthDay as T
import Data.Thyme.Calendar.Internal
import Data.Thyme.TH
data MonthDay = MonthDay
{ mdMonth :: !Month
, mdDay :: !DayOfMonth
} deriving (Eq, Ord, Data, Typeable, Show)
instance NFData MonthDay
monthDay :: Bool -> Simple Iso DayOfYear MonthDay
monthDay leap = iso fromOrdinal toOrdinal where
fromOrdinal :: DayOfYear -> MonthDay
fromOrdinal yd = MonthDay m d where
(m, d) = T.dayOfYearToMonthAndDay leap yd
toOrdinal :: MonthDay -> DayOfYear
toOrdinal (MonthDay m d) = T.monthAndDayToDayOfYear leap m d
monthDayToDayOfYearValid :: Bool -> MonthDay -> Maybe DayOfYear
monthDayToDayOfYearValid leap md@(MonthDay m d) = review (monthDay leap) md
<$ guard (1 <= m && m <= 12 && 1 <= d && d <= T.monthLength leap m)
monthLength :: Bool -> Month -> Int
monthLength = T.monthLength
thymeLenses ''MonthDay