yesod-goodies-0.0.3: Yesod/Goodies/Time.hs
-------------------------------------------------------------------------------
-- |
-- Module : Yesod.Goodies.Time
-- Copyright : (c) Patrick Brisbin 2010
-- License : as-is
--
-- Maintainer : pbrisbin@gmail.com
-- Stability : unstable
-- Portability : unportable
--
-------------------------------------------------------------------------------
module Yesod.Goodies.Time
( humanReadableTime
) where
import Yesod
import Data.Time
import System.Locale
import Data.Char (isSpace)
-- | Based on @humanReadableTimeDiff@ found in
-- <https://github.com/snoyberg/haskellers/blob/master/Haskellers.hs>,
-- <https://github.com/snoyberg/haskellers/blob/master/LICENSE>
humanReadableTime :: UTCTime -> GHandler s m String
humanReadableTime t = return . helper . flip diffUTCTime t =<< liftIO getCurrentTime
where
minutes :: NominalDiffTime -> Double
minutes n = realToFrac $ n / 60
hours :: NominalDiffTime -> Double
hours n = minutes n / 60
days :: NominalDiffTime -> Double
days n = hours n / 24
weeks :: NominalDiffTime -> Double
weeks n = days n / 7
years :: NominalDiffTime -> Double
years n = days n / 365
i2s :: RealFrac a => a -> String
i2s n = show m where m = truncate n :: Int
trim = f . f where f = reverse . dropWhile isSpace
old = utcToLocalTime utc t
dow = trim $! formatTime defaultTimeLocale "%l:%M %p on %A" old
thisYear = trim $! formatTime defaultTimeLocale "%b %e" old
previousYears = trim $! formatTime defaultTimeLocale "%b %e, %Y" old
helper d
| d < 1 = "just now"
| d < 60 = i2s d ++ " seconds ago"
| minutes d < 2 = "one minute ago"
| minutes d < 60 = i2s (minutes d) ++ " minutes ago"
| hours d < 2 = "one hour ago"
| hours d < 24 = "about " ++ i2s (hours d) ++ " hours ago"
| days d < 5 = "at " ++ dow
| days d < 10 = i2s (days d) ++ " days ago"
| weeks d < 2 = i2s (weeks d) ++ " week ago"
| weeks d < 5 = i2s (weeks d) ++ " weeks ago"
| years d < 1 = "on " ++ thisYear
| otherwise = "on " ++ previousYears