module Data.HodaTime.Calendar.Gregorian
(
calendarDate
,fromNthDay
,fromWeekDate
,Month(..)
,DayOfWeek(..)
,Gregorian
)
where
import Data.HodaTime.Calendar.Gregorian.Internal hiding (fromWeekDate)
import Data.HodaTime.CalendarDateTime.Internal (CalendarDate, DayNth, DayOfMonth, Year, WeekNumber)
import Data.HodaTime.Calendar.Internal (mkFromNthDay)
import qualified Data.HodaTime.Calendar.Gregorian.Internal as GI
import Control.Monad (guard)
calendarDate :: DayOfMonth -> Month Gregorian -> Year -> Maybe (CalendarDate Gregorian)
calendarDate :: Int -> Month Gregorian -> Int -> Maybe (CalendarDate Gregorian)
calendarDate Int
d Month Gregorian
m Int
y = do
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> Int
0 Bool -> Bool -> Bool
&& Int
d Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
<= Month Gregorian -> Int -> Int
maxDaysInMonth Month Gregorian
m Int
y
let gd :: CalendarDate Gregorian
gd = Int -> Month Gregorian -> Int -> CalendarDate Gregorian
gregorianFromYmd Int
y Month Gregorian
m Int
d
Bool -> Maybe ()
forall (f :: * -> *). Alternative f => Bool -> f ()
guard (Bool -> Maybe ()) -> Bool -> Maybe ()
forall a b. (a -> b) -> a -> b
$ CalendarDate Gregorian -> Int32
gregorianToDays CalendarDate Gregorian
gd Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
> Int32
forall a. Integral a => a
invalidDayThresh
CalendarDate Gregorian -> Maybe (CalendarDate Gregorian)
forall a. a -> Maybe a
forall (m :: * -> *) a. Monad m => a -> m a
return CalendarDate Gregorian
gd
fromNthDay :: DayNth -> DayOfWeek Gregorian -> Month Gregorian -> Year -> Maybe (CalendarDate Gregorian)
fromNthDay :: DayNth
-> DayOfWeek Gregorian
-> Month Gregorian
-> Int
-> Maybe (CalendarDate Gregorian)
fromNthDay = Int
-> DayOfWeek Gregorian
-> (Int -> Month Gregorian -> Int -> Int)
-> (Month Gregorian -> Int -> Int)
-> (Int32 -> CalendarDate Gregorian)
-> DayNth
-> DayOfWeek Gregorian
-> Month Gregorian
-> Int
-> Maybe (CalendarDate Gregorian)
forall mon dow d.
(Enum mon, Enum dow) =>
Int
-> dow
-> (Int -> mon -> Int -> Int)
-> (mon -> Int -> Int)
-> (Int32 -> d)
-> DayNth
-> dow
-> mon
-> Int
-> Maybe d
mkFromNthDay Int
forall a. Integral a => a
invalidDayThresh DayOfWeek Gregorian
epochDayOfWeek Int -> Month Gregorian -> Int -> Int
yearMonthDayToDays Month Gregorian -> Int -> Int
maxDaysInMonth Int32 -> CalendarDate Gregorian
daysToGregorian
fromWeekDate :: WeekNumber -> DayOfWeek Gregorian -> Year -> Maybe (CalendarDate Gregorian)
fromWeekDate :: Int -> DayOfWeek Gregorian -> Int -> Maybe (CalendarDate Gregorian)
fromWeekDate = Int
-> DayOfWeek Gregorian
-> Int
-> DayOfWeek Gregorian
-> Int
-> Maybe (CalendarDate Gregorian)
GI.fromWeekDate Int
1 DayOfWeek Gregorian
Sunday