module Data.HodaTime.Duration
(
Duration
,fromStandardWeeks
,fromStandardDays
,fromHours
,fromMinutes
,fromSeconds
,fromMilliseconds
,fromMicroseconds
,fromNanoseconds
,add
,minus
)
where
import Data.HodaTime.Duration.Internal
import Data.HodaTime.Instant.Internal (Instant(..))
import Data.HodaTime.Instant (difference)
import qualified Data.HodaTime.Instant as I (add)
import Data.HodaTime.Constants (secondsPerDay, secondsPerHour, nsecsPerSecond)
fromStandardWeeks :: Int -> Duration
fromStandardWeeks w = fromStandardDays $ w * 7
fromStandardDays :: Int -> Duration
fromStandardDays d = Duration $ Instant (fromIntegral d) 0 0
fromHours :: Int -> Duration
fromHours = fromSeconds . (* secondsPerHour)
fromMinutes :: Int -> Duration
fromMinutes = fromSeconds . (* 60)
fromMilliseconds :: Int -> Duration
fromMilliseconds = fromNanoseconds . (* 1000000)
fromMicroseconds :: Int -> Duration
fromMicroseconds = fromNanoseconds . (* 1000)
fromNanoseconds :: Int -> Duration
fromNanoseconds ns = Duration $ Instant (fromIntegral d) (fromIntegral s') (fromIntegral ns')
where
(s, ns') = normalize ns nsecsPerSecond
(d, s') = normalize s secondsPerDay
add :: Duration -> Duration -> Duration
add (Duration instant) = Duration . I.add instant
minus :: Duration -> Duration -> Duration
minus (Duration linstant) (Duration rinstant) = difference linstant rinstant