module Data.Thyme.Time where
import Control.Lens
import Data.AffineSpace
import Data.Basis
import Data.Int
import Data.Micro
import Data.Thyme.Calendar
import Data.Thyme.Calendar.OrdinalDate
import Data.Thyme.Calendar.MonthDay
import Data.Thyme.Calendar.WeekDate
import Data.Thyme.Clock.Internal
import Data.Thyme.Clock.POSIX
import Data.Thyme.Clock.TAI
import Data.Thyme.LocalTime
import qualified Data.Time.Calendar as T
import qualified Data.Time.Clock as T
import qualified Data.Time.Clock.TAI as T
import qualified Data.Time.LocalTime as T
class Thyme a b where
thyme :: Simple Iso a b
instance Thyme T.Day Day where
thyme = iso
(ModifiedJulianDay . fromInteger . T.toModifiedJulianDay)
(T.ModifiedJulianDay . fromIntegral . toModifiedJulianDay)
instance Thyme T.UniversalTime UniversalTime where
thyme = iso T.getModJulianDate T.ModJulianDate . from modJulianDate
instance Thyme T.DiffTime DiffTime where
thyme = iso (microsecondsToDiffTime . round . (*) 1000000)
( \ (DiffTime (Micro t)) ->
T.picosecondsToDiffTime $ toInteger t * 1000000 )
instance Thyme T.UTCTime UTCView where
thyme = iso
(\ (T.UTCTime d t) -> UTCTime (view thyme d) (view thyme t))
(\ (UTCTime d t) -> T.UTCTime (review thyme d) (review thyme t))
instance Thyme T.UTCTime UTCTime where
thyme = thyme . from utcTime
instance Thyme T.NominalDiffTime NominalDiffTime where
thyme = iso (microsecondsToNominalDiffTime . round . (*) 1000000)
(\ (NominalDiffTime t) -> fromRational $ t ^/^ basisValue ())
instance Thyme T.AbsoluteTime AbsoluteTime where
thyme = iso (`T.diffAbsoluteTime` T.taiEpoch)
(`T.addAbsoluteTime` T.taiEpoch)
. thyme . iso (taiEpoch .+^) (.-. taiEpoch)
instance Thyme T.TimeZone TimeZone where
thyme = id
instance Thyme T.TimeOfDay TimeOfDay where
thyme = iso ( \ (T.TimeOfDay h m s) -> TimeOfDay h m
. microsecondsToDiffTime . round $ s * 1000000 )
( \ (TimeOfDay h m s) -> T.TimeOfDay h m
. fromRational $ s ^/^ basisValue () )
instance Thyme T.LocalTime LocalTime where
thyme = iso
(\ (T.LocalTime d t) -> LocalTime (view thyme d) (view thyme t))
(\ (LocalTime d t) -> T.LocalTime (review thyme d) (review thyme t))
instance Thyme T.ZonedTime ZonedTime where
thyme = iso
(\ (T.ZonedTime t z) -> ZonedTime (view thyme t) (view thyme z))
(\ (ZonedTime t z) -> T.ZonedTime (review thyme t) (review thyme z))
addDays :: Days -> Day -> Day
addDays = flip (.+^)
diffDays :: Day -> Day -> Days
diffDays = (.-.)
toGregorian :: Day -> (Year, Month, DayOfMonth)
toGregorian (view gregorian -> YearMonthDay y m d) = (y, m, d)
fromGregorian :: Year -> Month -> DayOfMonth -> Day
fromGregorian y m d = review gregorian (YearMonthDay y m d)
fromGregorianValid :: Year -> Month -> DayOfMonth -> Maybe Day
fromGregorianValid y m d = gregorianValid (YearMonthDay y m d)
addGregorianMonthsClip :: Months -> Day -> Day
addGregorianMonthsClip n = review gregorian
. gregorianMonthsClip n . view gregorian
addGregorianMonthsRollover :: Months -> Day -> Day
addGregorianMonthsRollover n = review gregorian
. gregorianMonthsRollover n . view gregorian
addGregorianYearsClip :: Years -> Day -> Day
addGregorianYearsClip n = review gregorian
. gregorianYearsClip n . view gregorian
addGregorianYearsRollover :: Years -> Day -> Day
addGregorianYearsRollover n = review gregorian
. gregorianYearsRollover n . view gregorian
dayOfYearToMonthAndDay :: Bool -> DayOfYear -> (Month, DayOfMonth)
dayOfYearToMonthAndDay leap (view (monthDay leap) -> MonthDay m d) = (m, d)
monthAndDayToDayOfYear :: Bool -> Month -> DayOfMonth -> DayOfYear
monthAndDayToDayOfYear leap m d = review (monthDay leap) (MonthDay m d)
monthAndDayToDayOfYearValid :: Bool -> Month -> DayOfMonth -> Maybe DayOfYear
monthAndDayToDayOfYearValid leap m d = monthDayValid leap (MonthDay m d)
toOrdinalDate :: Day -> (Year, DayOfYear)
toOrdinalDate (view ordinalDate -> OrdinalDate y d) = (y, d)
fromOrdinalDate :: Year -> DayOfYear -> Day
fromOrdinalDate y d = review ordinalDate (OrdinalDate y d)
fromOrdinalDateValid :: Year -> DayOfYear -> Maybe Day
fromOrdinalDateValid y d = ordinalDateValid (OrdinalDate y d)
sundayStartWeek :: Day -> (Year, WeekOfYear, DayOfWeek)
sundayStartWeek (view sundayWeek -> SundayWeek y w d) = (y, w, d)
fromSundayStartWeek :: Year -> WeekOfYear -> DayOfWeek -> Day
fromSundayStartWeek y w d = review sundayWeek (SundayWeek y w d)
fromSundayStartWeekValid :: Year -> WeekOfYear -> DayOfWeek -> Maybe Day
fromSundayStartWeekValid y w d = sundayWeekValid (SundayWeek y w d)
mondayStartWeek :: Day -> (Year, WeekOfYear, DayOfWeek)
mondayStartWeek (view mondayWeek -> MondayWeek y w d) = (y, w, d)
fromMondayStartWeek :: Year -> WeekOfYear -> DayOfWeek -> Day
fromMondayStartWeek y w d = review mondayWeek (MondayWeek y w d)
fromMondayStartWeekValid :: Year -> WeekOfYear -> DayOfWeek -> Maybe Day
fromMondayStartWeekValid y w d = mondayWeekValid (MondayWeek y w d)
toWeekDate :: Day -> (Year, WeekOfYear, DayOfWeek)
toWeekDate (view weekDate -> WeekDate y w d) = (y, w, d)
fromWeekDate :: Year -> WeekOfYear -> DayOfWeek -> Day
fromWeekDate y w d = review weekDate (WeekDate y w d)
fromWeekDateValid :: Year -> WeekOfYear -> DayOfWeek -> Maybe Day
fromWeekDateValid y w d = weekDateValid (WeekDate y w d)
secondsToDiffTime :: Int64 -> DiffTime
secondsToDiffTime a = DiffTime (Micro $ a * 1000000)
picosecondsToDiffTime :: Int64 -> DiffTime
picosecondsToDiffTime a = DiffTime (Micro $ div (a + 500000) 1000000)
addUTCTime :: NominalDiffTime -> UTCTime -> UTCTime
addUTCTime = flip (.+^)
diffUTCTime :: UTCTime -> UTCTime -> NominalDiffTime
diffUTCTime = (.-.)
posixSecondsToUTCTime :: POSIXTime -> UTCTime
posixSecondsToUTCTime = review posixTime
utcTimeToPOSIXSeconds :: UTCTime -> POSIXTime
utcTimeToPOSIXSeconds = view posixTime
addAbsoluteTime :: DiffTime -> AbsoluteTime -> AbsoluteTime
addAbsoluteTime = flip (.+^)
diffAbsoluteTime :: AbsoluteTime -> AbsoluteTime -> DiffTime
diffAbsoluteTime = (.-.)
utcToTAITime :: LeapSecondTable -> UTCTime -> AbsoluteTime
utcToTAITime = view . absoluteTime
taiToUTCTime :: LeapSecondTable -> AbsoluteTime -> UTCTime
taiToUTCTime = review . absoluteTime
utcToLocalTimeOfDay :: TimeZone -> TimeOfDay -> (Days, TimeOfDay)
utcToLocalTimeOfDay = addMinutes . timeZoneMinutes
localToUTCTimeOfDay :: TimeZone -> TimeOfDay -> (Days, TimeOfDay)
localToUTCTimeOfDay = addMinutes . negate . timeZoneMinutes
timeToTimeOfDay :: DiffTime -> TimeOfDay
timeToTimeOfDay = view timeOfDay
timeOfDayToTime :: TimeOfDay -> DiffTime
timeOfDayToTime = review timeOfDay
dayFractionToTimeOfDay :: Rational -> TimeOfDay
dayFractionToTimeOfDay = review dayFraction
timeOfDayToDayFraction :: TimeOfDay -> Rational
timeOfDayToDayFraction = view dayFraction
utcToLocalTime :: TimeZone -> UTCTime -> LocalTime
utcToLocalTime = view . utcLocalTime
localTimeToUTC :: TimeZone -> LocalTime -> UTCTime
localTimeToUTC = review . utcLocalTime
ut1ToLocalTime :: Rational -> UniversalTime -> LocalTime
ut1ToLocalTime = view . ut1LocalTime
localTimeToUT1 :: Rational -> LocalTime -> UniversalTime
localTimeToUT1 = review . ut1LocalTime
utcToZonedTime :: TimeZone -> UTCTime -> ZonedTime
utcToZonedTime z t = view zonedTime (z, t)
zonedTimeToUTC :: ZonedTime -> UTCTime
zonedTimeToUTC = snd . review zonedTime