{-# LANGUAGE CPP #-}
{-# LANGUAGE TemplateHaskellQuotes #-}
module Data.Time.Clock.Compat (
    -- * Universal Time
    -- | Time as measured by the Earth.
    UniversalTime(..),

    -- * Absolute intervals, DiffTime
    DiffTime,
    pattern Picoseconds,
    pattern Seconds,
    pattern Minutes,
    pattern Hours,
    secondsToDiffTime,
    picosecondsToDiffTime,
    diffTimeToPicoseconds,

    -- * UTCTime
    UTCTime (..),

    -- * NominalDiffTime
    NominalDiffTime,
    pattern Nominal,
    secondsToNominalDiffTime,
    nominalDiffTimeToSeconds,
    nominalDay,

    -- * UTC differences
    addUTCTime,
    diffUTCTime,

    -- * Current time
    getCurrentTime,
    getTime_resolution,

    -- * Type aliases
    Year,
    MonthOfYear,
    DayOfMonth,
    ) where

import Data.Time.Orphans ()
import Data.Time.Calendar.Types

import Data.Time.Clock
import Data.Fixed (Pico, Fixed (MkFixed))
import Debug.Trace

#if !MIN_VERSION_time(1,15,0)
pattern Picoseconds :: Integer -> DiffTime
pattern $mPicoseconds :: forall {r}. DiffTime -> (Integer -> r) -> ((# #) -> r) -> r
$bPicoseconds :: Integer -> DiffTime
Picoseconds a <- (diffTimeToPicoseconds -> a)
    where
        Picoseconds Integer
a = Integer -> DiffTime
picosecondsToDiffTime Integer
a

{-# COMPLETE Picoseconds #-}

pattern Seconds :: Pico -> DiffTime
pattern $mSeconds :: forall {r}. DiffTime -> (Pico -> r) -> ((# #) -> r) -> r
$bSeconds :: Pico -> DiffTime
Seconds a <- (MkFixed . diffTimeToPicoseconds -> a)
  where
        Seconds Pico
a = Integer -> DiffTime
picosecondsToDiffTime (case Pico
a of MkFixed Integer
a' -> Integer
a')

{-# COMPLETE Seconds #-}

pattern Minutes :: Pico -> DiffTime
pattern $mMinutes :: forall {r}. DiffTime -> (Pico -> r) -> ((# #) -> r) -> r
$bMinutes :: Pico -> DiffTime
Minutes a <- Seconds ((/ 60) -> a)
    where
        Minutes Pico
a = Pico -> DiffTime
Seconds (Pico -> DiffTime) -> Pico -> DiffTime
forall a b. (a -> b) -> a -> b
$ Pico
a Pico -> Pico -> Pico
forall a. Num a => a -> a -> a
* Pico
60

{-# COMPLETE Minutes #-}

pattern Hours :: Pico -> DiffTime
pattern $mHours :: forall {r}. DiffTime -> (Pico -> r) -> ((# #) -> r) -> r
$bHours :: Pico -> DiffTime
Hours a <- Minutes ((/ 60) -> a)
    where
        Hours Pico
a = Pico -> DiffTime
Minutes (Pico -> DiffTime) -> Pico -> DiffTime
forall a b. (a -> b) -> a -> b
$ Pico
a Pico -> Pico -> Pico
forall a. Num a => a -> a -> a
* Pico
60

{-# COMPLETE Hours #-}

-- | convert from DiffTime
pattern Nominal :: DiffTime -> NominalDiffTime
pattern $mNominal :: forall {r}. NominalDiffTime -> (DiffTime -> r) -> ((# #) -> r) -> r
$bNominal :: DiffTime -> NominalDiffTime
Nominal dt <- (Seconds . nominalDiffTimeToSeconds -> dt)
    where
        Nominal DiffTime
dt = Pico -> NominalDiffTime
secondsToNominalDiffTime (case DiffTime
dt of Seconds Pico
dt' -> Pico
dt')

{-# COMPLETE Nominal #-}

#endif

#if !MIN_VERSION_time(1,9,1)

-- | Create a 'NominalDiffTime' from a number of seconds.
secondsToNominalDiffTime :: Pico -> NominalDiffTime
secondsToNominalDiffTime = realToFrac

-- | Get the seconds in a 'NominalDiffTime'.
nominalDiffTimeToSeconds :: NominalDiffTime -> Pico
nominalDiffTimeToSeconds = realToFrac

#endif