module Data.Duration
( humanReadableDuration
, humanReadableDiffTime
, humanReadableNominalDiffTime
, ms
, oneSecond
, minute
, hour
, day
, year
, getMs
, getSeconds
, getMinutes
, getHours
, getDays
, getYears
) where
import Data.Time.Clock (DiffTime, NominalDiffTime)
humanReadableDuration :: Int -> String
humanReadableDuration n
| n < oneSecond = let mi = getMs n in if mi > 0 then show mi ++ "ms" else ""
| n < minute = let s = getSeconds n in if s > 0 then show s ++ "s " ++ humanReadableDuration (n `rem` oneSecond) else ""
| n < hour = let m = getMinutes n in if m > 0 then show m ++ " min " ++ humanReadableDuration (n `rem` minute) else ""
| n < day = let h = getHours n in if h > 0 then show h ++ " hours " ++ humanReadableDuration (n `rem` hour) else ""
| n < year = let d = getDays n in if d > 0 then show d ++ " days " ++ humanReadableDuration (n `rem` day) else ""
| otherwise = let y = getYears n in if y > 0 then show y ++ " years " ++ humanReadableDuration (n `rem` year) else ""
humanReadableDiffTime :: DiffTime -> String
humanReadableDiffTime = humanReadableDuration
. round
. (* (1e6 :: Double))
. realToFrac
humanReadableNominalDiffTime :: NominalDiffTime -> String
humanReadableNominalDiffTime = humanReadableDuration
. round
. (* (1e6 :: Double))
. realToFrac
ms :: Int
ms = 1000
oneSecond :: Int
oneSecond = 1000 * ms
minute :: Int
minute = 60 * oneSecond
hour :: Int
hour = 60 * minute
day :: Int
day = 24 * hour
year :: Int
year = 365 * day
getMs :: Int -> Int
getMs n = n `div` ms
getSeconds :: Int -> Int
getSeconds n = n `div` oneSecond
getMinutes :: Int -> Int
getMinutes n = n `div` minute
getHours :: Int -> Int
getHours n = n `div` hour
getDays :: Int -> Int
getDays n = n `div` day
getYears :: Int -> Int
getYears n = n `div` year