packages feed

postgresql-types-0.1: src/time-extras/TimeExtras/TimeOfDay.hs

module TimeExtras.TimeOfDay where

import Control.Monad
import Data.Fixed
import Data.Time
import Prelude

fromMicroseconds :: Int -> TimeOfDay
fromMicroseconds microseconds =
  -- Handle the special case of 24:00:00 (86400000000 microseconds)
  if microseconds == 86_400_000_000
    then TimeOfDay 24 0 0
    else
      let (minutes, microseconds') = divMod microseconds 60_000_000
          (hours, minutes') = divMod minutes 60
          picoseconds = MkFixed (fromIntegral microseconds' * 1_000_000)
       in TimeOfDay hours minutes' picoseconds

normalizeToMicroseconds :: TimeOfDay -> Int
normalizeToMicroseconds (TimeOfDay hours minutes picoseconds) =
  let MkFixed picoseconds' = picoseconds
      microseconds = div picoseconds' 1_000_000
      microseconds' = fromIntegral ((hours * 60 + minutes) * 60) * 1_000_000 + fromIntegral microseconds
   in microseconds'

refineToMicroseconds :: TimeOfDay -> Maybe Int
refineToMicroseconds (TimeOfDay hours minutes picoseconds) = do
  let MkFixed picoseconds' = picoseconds
      (microseconds, remainder) = divMod picoseconds' 1_000_000
  guard (remainder == 0)
  let microseconds' = fromIntegral ((hours * 60 + minutes) * 60) * 1_000_000 + fromIntegral microseconds
  pure microseconds'