{-# OPTIONS_GHC -fno-warn-orphans #-}
module Data.UnixTime.Diff (
diffUnixTime
, addUnixDiffTime
, secondsToUnixDiffTime
, microSecondsToUnixDiffTime
) where
import Data.UnixTime.Types
import Data.Int
import Foreign.C.Types
calc :: CTime -> Int32 -> UnixDiffTime
calc :: CTime -> Int32 -> UnixDiffTime
calc sec :: CTime
sec usec :: Int32
usec = (CTime -> Int32 -> UnixDiffTime) -> (CTime, Int32) -> UnixDiffTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry CTime -> Int32 -> UnixDiffTime
UnixDiffTime ((CTime, Int32) -> UnixDiffTime)
-> (Int32 -> (CTime, Int32)) -> Int32 -> UnixDiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CTime -> Int32 -> (CTime, Int32)
adjust CTime
sec (Int32 -> UnixDiffTime) -> Int32 -> UnixDiffTime
forall a b. (a -> b) -> a -> b
$ Int32
usec
calc' :: CTime -> Int32 -> UnixDiffTime
calc' :: CTime -> Int32 -> UnixDiffTime
calc' sec :: CTime
sec usec :: Int32
usec = (CTime -> Int32 -> UnixDiffTime) -> (CTime, Int32) -> UnixDiffTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry CTime -> Int32 -> UnixDiffTime
UnixDiffTime ((CTime, Int32) -> UnixDiffTime)
-> (Int32 -> (CTime, Int32)) -> Int32 -> UnixDiffTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CTime -> Int32 -> (CTime, Int32)
slowAdjust CTime
sec (Int32 -> UnixDiffTime) -> Int32 -> UnixDiffTime
forall a b. (a -> b) -> a -> b
$ Int32
usec
calcU :: CTime -> Int32 -> UnixTime
calcU :: CTime -> Int32 -> UnixTime
calcU sec :: CTime
sec usec :: Int32
usec = (CTime -> Int32 -> UnixTime) -> (CTime, Int32) -> UnixTime
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry CTime -> Int32 -> UnixTime
UnixTime ((CTime, Int32) -> UnixTime)
-> (Int32 -> (CTime, Int32)) -> Int32 -> UnixTime
forall b c a. (b -> c) -> (a -> b) -> a -> c
. CTime -> Int32 -> (CTime, Int32)
adjust CTime
sec (Int32 -> UnixTime) -> Int32 -> UnixTime
forall a b. (a -> b) -> a -> b
$ Int32
usec
instance Num UnixDiffTime where
UnixDiffTime s1 :: CTime
s1 u1 :: Int32
u1 + :: UnixDiffTime -> UnixDiffTime -> UnixDiffTime
+ UnixDiffTime s2 :: CTime
s2 u2 :: Int32
u2 = CTime -> Int32 -> UnixDiffTime
calc (CTime
s1CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+CTime
s2) (Int32
u1Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+Int32
u2)
UnixDiffTime s1 :: CTime
s1 u1 :: Int32
u1 - :: UnixDiffTime -> UnixDiffTime -> UnixDiffTime
- UnixDiffTime s2 :: CTime
s2 u2 :: Int32
u2 = CTime -> Int32 -> UnixDiffTime
calc (CTime
s1CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
-CTime
s2) (Int32
u1Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
-Int32
u2)
UnixDiffTime s1 :: CTime
s1 u1 :: Int32
u1 * :: UnixDiffTime -> UnixDiffTime -> UnixDiffTime
* UnixDiffTime s2 :: CTime
s2 u2 :: Int32
u2 = CTime -> Int32 -> UnixDiffTime
calc' (CTime
s1CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
*CTime
s2) (Int32
u1Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
*Int32
u2)
negate :: UnixDiffTime -> UnixDiffTime
negate (UnixDiffTime s :: CTime
s u :: Int32
u) = CTime -> Int32 -> UnixDiffTime
UnixDiffTime (-CTime
s) (-Int32
u)
abs :: UnixDiffTime -> UnixDiffTime
abs (UnixDiffTime s :: CTime
s u :: Int32
u) = CTime -> Int32 -> UnixDiffTime
UnixDiffTime (CTime -> CTime
forall a. Num a => a -> a
abs CTime
s) (Int32 -> Int32
forall a. Num a => a -> a
abs Int32
u)
signum :: UnixDiffTime -> UnixDiffTime
signum (UnixDiffTime s :: CTime
s u :: Int32
u)
| CTime
s CTime -> CTime -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
&& Int32
u Int32 -> Int32 -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = 0
| CTime
s CTime -> CTime -> Bool
forall a. Ord a => a -> a -> Bool
> 0 = 1
| Bool
otherwise = -1
fromInteger :: Integer -> UnixDiffTime
fromInteger i :: Integer
i = CTime -> Int32 -> UnixDiffTime
UnixDiffTime (Integer -> CTime
forall a. Num a => Integer -> a
fromInteger Integer
i) 0
{-# RULES "Integral->UnixDiffTime" fromIntegral = secondsToUnixDiffTime #-}
instance Real UnixDiffTime where
toRational :: UnixDiffTime -> Rational
toRational = UnixDiffTime -> Rational
forall a. Fractional a => UnixDiffTime -> a
toFractional
{-# RULES "UnixDiffTime->Fractional" realToFrac = toFractional #-}
diffUnixTime :: UnixTime -> UnixTime -> UnixDiffTime
diffUnixTime :: UnixTime -> UnixTime -> UnixDiffTime
diffUnixTime (UnixTime s1 :: CTime
s1 u1 :: Int32
u1) (UnixTime s2 :: CTime
s2 u2 :: Int32
u2) = CTime -> Int32 -> UnixDiffTime
calc (CTime
s1CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
-CTime
s2) (Int32
u1Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
-Int32
u2)
addUnixDiffTime :: UnixTime -> UnixDiffTime -> UnixTime
addUnixDiffTime :: UnixTime -> UnixDiffTime -> UnixTime
addUnixDiffTime (UnixTime s1 :: CTime
s1 u1 :: Int32
u1) (UnixDiffTime s2 :: CTime
s2 u2 :: Int32
u2) = CTime -> Int32 -> UnixTime
calcU (CTime
s1CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+CTime
s2) (Int32
u1Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+Int32
u2)
secondsToUnixDiffTime :: (Integral a) => a -> UnixDiffTime
secondsToUnixDiffTime :: a -> UnixDiffTime
secondsToUnixDiffTime sec :: a
sec = CTime -> Int32 -> UnixDiffTime
UnixDiffTime (a -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
sec) 0
{-# INLINE secondsToUnixDiffTime #-}
microSecondsToUnixDiffTime :: (Integral a) => a -> UnixDiffTime
microSecondsToUnixDiffTime :: a -> UnixDiffTime
microSecondsToUnixDiffTime usec :: a
usec = CTime -> Int32 -> UnixDiffTime
calc (a -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
s) (a -> Int32
forall a b. (Integral a, Num b) => a -> b
fromIntegral a
u)
where
(s :: a
s,u :: a
u) = a -> (a, a)
forall a. Integral a => a -> (a, a)
secondMicro a
usec
{-# INLINE microSecondsToUnixDiffTime #-}
adjust :: CTime -> Int32 -> (CTime, Int32)
adjust :: CTime -> Int32 -> (CTime, Int32)
adjust sec :: CTime
sec usec :: Int32
usec
| CTime
sec CTime -> CTime -> Bool
forall a. Ord a => a -> a -> Bool
>= 0 = (CTime, Int32)
ajp
| Bool
otherwise = (CTime, Int32)
ajm
where
micro :: Int32
micro = 1000000
mmicro :: Int32
mmicro = - Int32
micro
ajp :: (CTime, Int32)
ajp
| Int32
usec Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
>= Int32
micro = (CTime
sec CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ 1, Int32
usec Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
micro)
| Int32
usec Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
>= 0 = (CTime
sec, Int32
usec)
| Bool
otherwise = (CTime
sec CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- 1, Int32
usec Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
micro)
ajm :: (CTime, Int32)
ajm
| Int32
usec Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
<= Int32
mmicro = (CTime
sec CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
- 1, Int32
usec Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
+ Int32
micro)
| Int32
usec Int32 -> Int32 -> Bool
forall a. Ord a => a -> a -> Bool
<= 0 = (CTime
sec, Int32
usec)
| Bool
otherwise = (CTime
sec CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ 1, Int32
usec Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
micro)
slowAdjust :: CTime -> Int32 -> (CTime, Int32)
slowAdjust :: CTime -> Int32 -> (CTime, Int32)
slowAdjust sec :: CTime
sec usec :: Int32
usec = (CTime
sec CTime -> CTime -> CTime
forall a. Num a => a -> a -> a
+ Int32 -> CTime
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int32
s, Int32
usec Int32 -> Int32 -> Int32
forall a. Num a => a -> a -> a
- Int32
u)
where
(s :: Int32
s,u :: Int32
u) = Int32 -> (Int32, Int32)
forall a. Integral a => a -> (a, a)
secondMicro Int32
usec
secondMicro :: Integral a => a -> (a,a)
secondMicro :: a -> (a, a)
secondMicro usec :: a
usec = a
usec a -> a -> (a, a)
forall a. Integral a => a -> a -> (a, a)
`quotRem` 1000000
toFractional :: Fractional a => UnixDiffTime -> a
toFractional :: UnixDiffTime -> a
toFractional (UnixDiffTime s :: CTime
s u :: Int32
u) = CTime -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac CTime
s a -> a -> a
forall a. Num a => a -> a -> a
+ Int32 -> a
forall a b. (Real a, Fractional b) => a -> b
realToFrac Int32
u a -> a -> a
forall a. Fractional a => a -> a -> a
/ 1000000
{-# SPECIALIZE toFractional :: UnixDiffTime -> Double #-}