attoparsec-iso8601-1.1.0.1: src/Data/Attoparsec/Time/Internal.hs
-- |
-- Module: Data.Aeson.Internal.Time
-- Copyright: (c) 2015-2016 Bryan O'Sullivan
-- License: BSD3
-- Maintainer: Bryan O'Sullivan <bos@serpentine.com>
-- Stability: experimental
-- Portability: portable
module Data.Attoparsec.Time.Internal
(
TimeOfDay64(..)
, fromPico
, toPico
, diffTimeOfDay64
, toTimeOfDay64
) where
import Data.Fixed (Fixed(MkFixed), Pico)
import Data.Int (Int64)
import Data.Time (TimeOfDay(..))
import Data.Time.Clock.Compat (DiffTime, diffTimeToPicoseconds)
toPico :: Integer -> Pico
toPico = MkFixed
{-# DEPRECATED toPico "Use MkFixed" #-}
fromPico :: Pico -> Integer
fromPico (MkFixed i) = i
{-# DEPRECATED fromPico "Use MkFixed" #-}
-- | Like TimeOfDay, but using a fixed-width integer for seconds.
data TimeOfDay64 = TOD {-# UNPACK #-} !Int
{-# UNPACK #-} !Int
{-# UNPACK #-} !Int64
posixDayLength :: DiffTime
posixDayLength = 86400
diffTimeOfDay64 :: DiffTime -> TimeOfDay64
diffTimeOfDay64 t
| t >= posixDayLength = TOD 23 59 (60000000000000 + pico (t - posixDayLength))
| otherwise = TOD (fromIntegral h) (fromIntegral m) s
where (h,mp) = pico t `quotRem` 3600000000000000
(m,s) = mp `quotRem` 60000000000000
pico = fromIntegral . diffTimeToPicoseconds
toTimeOfDay64 :: TimeOfDay -> TimeOfDay64
toTimeOfDay64 (TimeOfDay h m (MkFixed s)) = TOD h m (fromIntegral s)