{-# LANGUAGE TemplateHaskell #-}
module Time where
import qualified Data.Text as T
import Data.Time.Clock (UTCTime, addUTCTime, getCurrentTime)
import Data.Time.Format (defaultTimeLocale, formatTime, iso8601DateFormat)
import OurPrelude
data Time m a where
Now :: Time m UTCTime
makeSem ''Time
runIO :: Member (Embed IO) r => Sem (Time ': r) a -> Sem r a
runIO =
interpret $ \case
Now -> embed getCurrentTime
runPure :: UTCTime -> Sem (Time ': r) a -> Sem r a
runPure t =
interpret $ \case
Now -> pure t
-- | Return the UTC time 1 hour ago
-- $setup
-- >>> import Data.Time.Format (parseTimeOrError)
-- >>> let exampleCurrentTime = parseTimeOrError False defaultTimeLocale "%Y-%-m-%-d" "2019-06-06" :: UTCTime
--
-- Examples:
--
-- >>> run $ runPure exampleCurrentTime oneHourAgo
-- 2019-06-05 23:00:00 UTC
oneHourAgo :: Member Time r => Sem r UTCTime
oneHourAgo = now <&> addUTCTime (fromInteger $ -60 * 60)
-- | Return the UTC time 2 hours ago
--
-- Examples:
--
-- >>> run $ runPure exampleCurrentTime twoHoursAgo
-- 2019-06-05 22:00:00 UTC
twoHoursAgo :: Member Time r => Sem r UTCTime
twoHoursAgo = now <&> addUTCTime (fromInteger $ -60 * 60 * 2)
-- | Return the current ISO8601 date and time without timezone
--
-- TODO: switch to Data.Time.Format.ISO8601 once time-1.9.0 is available
-- unix depends on an earlier version currently https://github.com/haskell/unix/issues/131
--
-- Examples:
--
-- >>> run $ runPure exampleCurrentTime runDate
-- "2019-06-06T00:00:00"
runDate :: Member Time r => Sem r Text
runDate =
now <&> formatTime defaultTimeLocale (iso8601DateFormat (Just "%H:%M:%S"))
<&> T.pack