{-# LANGUAGE TypeFamilies #-}
module Data.HodaTime.CalendarDateTime.Internal
(
DayNth(..)
,Year
,WeekNumber
,DayOfMonth
,CalendarDate(..)
,CalendarDateTime(..)
,IsCalendar(..)
,HasDate(..)
,LocalTime(..)
,IsCalendarDateTime(..)
,at
)
where
import Data.HodaTime.Instant.Internal (Instant)
import Data.Int (Int32)
import Data.Word (Word8, Word32)
data DayNth =
FourthToLast
| ThirdToLast
| SecondToLast
| Last
| First
| Second
| Third
| Fourth
| Fifth
deriving (Eq, Show, Enum)
type Year = Int
type DayOfMonth = Int
type WeekNumber = Int
data CalendarDate calendar = CalendarDate { cdDays :: Int32, cdDay :: Word8, cdMonth :: Word8, cdYear :: Word32 }
deriving (Eq, Show, Ord)
class IsCalendar cal where
type Date cal
data DayOfWeek cal
data Month cal
day' :: Functor f => (DayOfMonth -> f DayOfMonth) -> CalendarDate cal -> f (CalendarDate cal)
month' :: CalendarDate cal -> Month cal
monthl' :: Functor f => (Int -> f Int) -> CalendarDate cal -> f (CalendarDate cal)
year' :: Functor f => (Year -> f Year) -> CalendarDate cal -> f (CalendarDate cal)
dayOfWeek' :: CalendarDate cal -> DayOfWeek cal
next' :: Int -> DayOfWeek cal -> CalendarDate cal -> CalendarDate cal
previous' :: Int -> DayOfWeek cal -> CalendarDate cal -> CalendarDate cal
class HasDate d where
type DoW d
type MoY d
day :: Functor f => (DayOfMonth -> f DayOfMonth) -> d -> f d
month :: d -> MoY d
monthl :: Functor f => (Int -> f Int) -> d -> f d
year :: Functor f => (Year -> f Year) -> d -> f d
dayOfWeek :: d -> DoW d
next :: Int -> DoW d -> d -> d
previous :: Int -> DoW d -> d -> d
instance (IsCalendar cal) => HasDate (CalendarDate cal) where
type DoW (CalendarDate cal) = DayOfWeek cal
type MoY (CalendarDate cal) = Month cal
day = day'
month = month'
monthl = monthl'
year = year'
dayOfWeek = dayOfWeek'
next = next'
previous = previous'
data LocalTime = LocalTime { ltSecs :: Word32, ltNsecs :: Word32 }
deriving (Eq, Ord, Show)
data CalendarDateTime calendar = CalendarDateTime (CalendarDate calendar) LocalTime
deriving (Eq, Show, Ord)
instance (IsCalendar cal) => HasDate (CalendarDateTime cal) where
type DoW (CalendarDateTime cal) = DayOfWeek cal
type MoY (CalendarDateTime cal) = Month cal
day f (CalendarDateTime cd lt) = flip CalendarDateTime lt <$> day f cd
month (CalendarDateTime cd _) = month cd
monthl f (CalendarDateTime cd lt) = flip CalendarDateTime lt <$> monthl f cd
year f (CalendarDateTime cd lt) = flip CalendarDateTime lt <$> year f cd
dayOfWeek (CalendarDateTime cd _) = dayOfWeek cd
next i dow (CalendarDateTime cd lt) = CalendarDateTime (next i dow cd) lt
previous i dow (CalendarDateTime cd lt) = CalendarDateTime (previous i dow cd) lt
class IsCalendarDateTime cal where
fromAdjustedInstant :: Instant -> CalendarDateTime cal
toUnadjustedInstant :: CalendarDateTime cal -> Instant
at :: CalendarDate cal -> LocalTime -> CalendarDateTime cal
at date time = CalendarDateTime date time