[commit: packages/time] format-widths,master,posix-perf,tasty: Use Word32 for ptNanoSeconds; replace normalizePosix with makePOSIXTime (c04bf45)

git at git.haskell.org git at git.haskell.org
Mon Feb 20 21:19:07 UTC 2017


Repository : ssh://git@git.haskell.org/time

On branches: format-widths,master,posix-perf,tasty
Link       : http://git.haskell.org/packages/time.git/commitdiff/c04bf45d01ecac8c150cf67097a8902846e383c0

>---------------------------------------------------------------

commit c04bf45d01ecac8c150cf67097a8902846e383c0
Author: Ashley Yakeley <ashley at yakeley.org>
Date:   Mon Dec 5 23:04:50 2016 -0800

    Use Word32 for ptNanoSeconds; replace normalizePosix with makePOSIXTime


>---------------------------------------------------------------

c04bf45d01ecac8c150cf67097a8902846e383c0
 lib/Data/Time/Clock/POSIX.hs | 38 +++++++++++++-------------------------
 1 file changed, 13 insertions(+), 25 deletions(-)

diff --git a/lib/Data/Time/Clock/POSIX.hs b/lib/Data/Time/Clock/POSIX.hs
index 68516cd..91a096a 100644
--- a/lib/Data/Time/Clock/POSIX.hs
+++ b/lib/Data/Time/Clock/POSIX.hs
@@ -2,20 +2,22 @@
 -- Most people won't need this module.
 module Data.Time.Clock.POSIX
 (
-    posixDayLength,POSIXTime(..),posixSecondsToUTCTime,utcTimeToPOSIXSeconds,getPOSIXTime,getCurrentTime
+    posixDayLength,POSIXTime,
+    makePOSIXTime,ptSeconds,ptNanoSeconds,
+    posixSecondsToUTCTime,utcTimeToPOSIXSeconds,getPOSIXTime,getCurrentTime
 ) where
 
 import Data.Time.Clock.UTC
 import Data.Time.Clock.Scale (picosecondsToDiffTime)
 import Data.Time.Calendar.Days
 import Data.Int (Int64)
+import Data.Word
 import Data.Fixed (divMod')
 import Control.DeepSeq
 
 #include "HsTimeConfig.h"
 
 #ifdef mingw32_HOST_OS
-import Data.Word (Word64)
 import System.Win32.Time
 #elif HAVE_CLOCK_GETTIME
 import Data.Time.Clock.CTimespec
@@ -31,36 +33,22 @@ import Foreign.C.Types (CLong(..))
 --
 data POSIXTime = POSIXTime
     { ptSeconds ::     {-# UNPACK #-} !Int64
-    , ptNanoSeconds :: {-# UNPACK #-} !Int64
-    }
+    , ptNanoSeconds :: {-# UNPACK #-} !Word32
+    } deriving (Eq,Ord)
 
-normalizePosix :: POSIXTime -> POSIXTime
-normalizePosix raw@(POSIXTime xs xn)
-    | xn < 0 || xn >= 1000000000 = POSIXTime (xs + q)  r
-    | otherwise                  = raw
+makePOSIXTime :: Int64 -> Word32 -> POSIXTime
+makePOSIXTime xs xn
+    | xn < 0 || xn >= 1000000000 = POSIXTime (xs + fromIntegral q)  r
+    | otherwise                  = POSIXTime xs xn
   where (q, r) = xn `divMod` 1000000000
 
-instance Eq POSIXTime where
-    rawx == rawy =
-        let POSIXTime xs xn = normalizePosix rawx
-            POSIXTime ys yn = normalizePosix rawy
-        in xs == ys && xn == yn
-
-instance Ord POSIXTime where
-    rawx `compare` rawy =
-        let POSIXTime xs xn = normalizePosix rawx
-            POSIXTime ys yn = normalizePosix rawy
-            os = compare xs ys
-        in if os == EQ then xn `compare` yn else os
-
 instance NFData POSIXTime where
     rnf a = a `seq` ()
 
 posixToUTCTime :: POSIXTime -> UTCTime
-posixToUTCTime raw =
-    let POSIXTime s ns = normalizePosix raw
-        (d, s') = s `divMod` posixDayLength
-        ps = s' * 1000000000000 + ns * 1000 -- 'Int64' can hold ps in one day
+posixToUTCTime (POSIXTime s ns) =
+    let (d, s') = s `divMod` posixDayLength
+        ps = s' * 1000000000000 + fromIntegral (ns * 1000) -- 'Int64' can hold ps in one day
     in UTCTime (addDays (fromIntegral d) unixEpochDay)
                (picosecondsToDiffTime (fromIntegral ps))
 



More information about the ghc-commits mailing list