dhodovsk / source-git / ghc-aeson

Forked from source-git/ghc-aeson 4 years ago
Clone

Blame attoparsec-iso8601/Data/Attoparsec/Time/Internal.hs

Packit 9a2dfb
{-# LANGUAGE CPP #-}
Packit 9a2dfb
Packit 9a2dfb
-- |
Packit 9a2dfb
-- Module:      Data.Aeson.Internal.Time
Packit 9a2dfb
-- Copyright:   (c) 2015-2016 Bryan O'Sullivan
Packit 9a2dfb
-- License:     BSD3
Packit 9a2dfb
-- Maintainer:  Bryan O'Sullivan <bos@serpentine.com>
Packit 9a2dfb
-- Stability:   experimental
Packit 9a2dfb
-- Portability: portable
Packit 9a2dfb
Packit 9a2dfb
module Data.Attoparsec.Time.Internal
Packit 9a2dfb
    (
Packit 9a2dfb
      TimeOfDay64(..)
Packit 9a2dfb
    , fromPico
Packit 9a2dfb
    , toPico
Packit 9a2dfb
    , diffTimeOfDay64
Packit 9a2dfb
    , toTimeOfDay64
Packit 9a2dfb
    ) where
Packit 9a2dfb
Packit 9a2dfb
import Prelude ()
Packit 9a2dfb
import Prelude.Compat
Packit 9a2dfb
Packit 9a2dfb
import Data.Int (Int64)
Packit 9a2dfb
import Data.Time
Packit 9a2dfb
import Unsafe.Coerce (unsafeCoerce)
Packit 9a2dfb
Packit 9a2dfb
#if MIN_VERSION_base(4,7,0)
Packit 9a2dfb
Packit 9a2dfb
import Data.Fixed (Pico, Fixed(MkFixed))
Packit 9a2dfb
Packit 9a2dfb
toPico :: Integer -> Pico
Packit 9a2dfb
toPico = MkFixed
Packit 9a2dfb
Packit 9a2dfb
fromPico :: Pico -> Integer
Packit 9a2dfb
fromPico (MkFixed i) = i
Packit 9a2dfb
Packit 9a2dfb
#else
Packit 9a2dfb
Packit 9a2dfb
import Data.Fixed (Pico)
Packit 9a2dfb
Packit 9a2dfb
toPico :: Integer -> Pico
Packit 9a2dfb
toPico = unsafeCoerce
Packit 9a2dfb
Packit 9a2dfb
fromPico :: Pico -> Integer
Packit 9a2dfb
fromPico = unsafeCoerce
Packit 9a2dfb
Packit 9a2dfb
#endif
Packit 9a2dfb
Packit 9a2dfb
-- | Like TimeOfDay, but using a fixed-width integer for seconds.
Packit 9a2dfb
data TimeOfDay64 = TOD {-# UNPACK #-} !Int
Packit 9a2dfb
                       {-# UNPACK #-} !Int
Packit 9a2dfb
                       {-# UNPACK #-} !Int64
Packit 9a2dfb
Packit 9a2dfb
diffTimeOfDay64 :: DiffTime -> TimeOfDay64
Packit 9a2dfb
diffTimeOfDay64 t = TOD (fromIntegral h) (fromIntegral m) s
Packit 9a2dfb
  where (h,mp) = fromIntegral pico `quotRem` 3600000000000000
Packit 9a2dfb
        (m,s)  = mp `quotRem` 60000000000000
Packit 9a2dfb
        pico   = unsafeCoerce t :: Integer
Packit 9a2dfb
Packit 9a2dfb
toTimeOfDay64 :: TimeOfDay -> TimeOfDay64
Packit 9a2dfb
toTimeOfDay64 (TimeOfDay h m s) = TOD h m (fromIntegral (fromPico s))