polysemy-chronos-0.1.2.0: lib/Polysemy/Chronos/Orphans.hs
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Polysemy.Chronos.Orphans where
import qualified Chronos as Chronos
import Chronos (
Date(Date),
Datetime(Datetime),
DayOfMonth(DayOfMonth),
Month(Month),
Time,
TimeOfDay(TimeOfDay),
Timespan(Timespan),
Year(Year),
)
import Prelude hiding (second)
import Polysemy.Time.Calendar (
Calendar(..),
HasDate(..),
HasDay(..),
HasHour(..),
HasMinute(..),
HasMonth(..),
HasNanoSecond(..),
HasSecond(..),
HasYear(..),
)
import Polysemy.Time.Data.TimeUnit (
Days(Days),
Hours(Hours),
Minutes(Minutes),
Months(Months),
NanoSeconds(NanoSeconds),
TimeUnit(..),
Years(Years),
convert,
)
instance HasDate Time Date where
date =
Chronos.datetimeDate . Chronos.timeToDatetime
dateToTime d =
Chronos.datetimeToTime (Datetime d (TimeOfDay 0 0 0))
instance HasYear Date where
year (Date (Chronos.Year y) _ _) =
Years (fromIntegral y)
instance HasYear Datetime where
year (Datetime d _) =
year d
instance HasYear Time where
year =
year . Chronos.timeToDatetime
instance HasMonth Date where
month (Date _ (Chronos.Month m) _) =
Months (fromIntegral m)
instance HasMonth Datetime where
month (Datetime d _) =
month d
instance HasMonth Time where
month =
month . Chronos.timeToDatetime
instance HasDay Date where
day (Date _ _ (Chronos.DayOfMonth d)) =
Days (fromIntegral d)
instance HasDay Datetime where
day (Datetime d _) =
day d
instance HasDay Time where
day =
day . Chronos.timeToDatetime
instance HasHour TimeOfDay where
hour (TimeOfDay h _ _) =
Hours (fromIntegral h)
instance HasHour Datetime where
hour (Datetime _ t) =
hour t
instance HasHour Time where
hour =
hour . Chronos.timeToDatetime
instance HasMinute TimeOfDay where
minute (TimeOfDay _ m _) =
Minutes (fromIntegral m)
instance HasMinute Datetime where
minute (Datetime _ t) =
minute t
instance HasMinute Time where
minute =
minute . Chronos.timeToDatetime
instance HasNanoSecond TimeOfDay where
nanoSecond (TimeOfDay _ _ s) =
NanoSeconds (fromIntegral s)
instance HasNanoSecond Datetime where
nanoSecond (Datetime _ t) =
nanoSecond t
instance HasNanoSecond Time where
nanoSecond =
nanoSecond . Chronos.timeToDatetime
instance HasSecond TimeOfDay where
second t =
convert (nanoSecond t)
instance HasSecond Datetime where
second (Datetime _ t) =
second t
instance HasSecond Time where
second =
second . Chronos.timeToDatetime
instance Calendar Datetime where
type CalendarDate Datetime = Date
type CalendarTime Datetime = TimeOfDay
mkDate y m d =
Date (Year (fromIntegral y)) (Month (fromIntegral m)) (DayOfMonth (fromIntegral d))
mkTime h m s =
TimeOfDay (fromIntegral h) (fromIntegral m) (fromIntegral (s * 1000000000))
mkDatetime y mo d h mi s =
Datetime (mkDate @Datetime y mo d) (mkTime @Datetime h mi s)
instance TimeUnit Timespan where
nanos =
1
toNanos (Timespan ns) =
NanoSeconds ns
fromNanos (NanoSeconds ns) =
Timespan ns