packages feed

hora-2.2.1: src/Data/Time/Hora/Span.hs

{- | Conversion between 'TimeSpan', 'DiffTime', 'NominalDiffTime', 'F.pico' -}
module Data.Time.Hora.Span
    (-- ** 'TimeSpan'
    toPico,
    toMilli,
    toSec,
    -- ** multipliers
    picoSec,
    picoMs,
    msSec,
    -- ** 'F.Pico' - 'TimeSpan' conversion
    picoTimeSpan,
    timeSpanPico,
    -- ** diff time
    toDiffTime,
    nominalDiff
    ) where

import Data.Fixed as F
import Data.Ratio
import Data.Time.Clock
import Data.Time.Hora.Type
import Data.Time.Hora.Internal.Span as S
import Data.Time.Hora.Internal.FromIntegral (fi)



-- | convert 'TimeSpan' to 'DiffTime'
toDiffTime :: Integral a => TimeSpan a -> DiffTime
toDiffTime (Sec s0) = secondsToDiffTime $ fi s0
toDiffTime (S.Pico s0) = picosecondsToDiffTime $ fi s0
toDiffTime t0@(Milli s0) = picosecondsToDiffTime $ toPico t0


-- | convert 'TimeSpan' to 'NominalDiffTime'
nominalDiff :: Integral a => TimeSpan a -> NominalDiffTime
nominalDiff ts0 = let s1 = toPico ts0::Integer
                in fromRational $ s1 % picoSec


-- | convert 'F.Pico' to 'TimeSpan'
picoTimeSpan :: Integral a => F.Pico -> TimeSpan a
picoTimeSpan (MkFixed p0) = S.Pico $ fi p0


-- | convert 'TimeSpan' to 'F.Pico'
timeSpanPico :: Integral a => TimeSpan a -> F.Pico
timeSpanPico ts0 = MkFixed $ fi p0
        where p0 = toPico ts0