module Utils.Time ( getCurrentFormattedTime , asleepDuration , addNoise ) where import Data.Text (Text) import qualified Data.Text as T import Data.Time.Clock (DiffTime) import qualified Data.Time.Clock as Clock import qualified Data.Time.Format as Format import qualified Data.Time.LocalTime as LocalTime import qualified System.Random as Random getCurrentFormattedTime :: IO Text getCurrentFormattedTime = do zonedTime <- LocalTime.getZonedTime return (T.pack $ Format.formatTime Format.defaultTimeLocale "%Hh%M" zonedTime) asleepDuration :: DiffTime -> DiffTime -> DiffTime -> Maybe DiffTime asleepDuration from to t = if t < from && from < to then Just $ from - t else if t > to && to > from then Just $ day - t + from else if t > to && t < from then Just $ from - t else Nothing where day = (realToFrac Clock.nominalDay) :: DiffTime -- |Add noise to a duration. -- > t - (n / 2) <= addNoise t n <= t + (n / 2) addNoise :: DiffTime -> DiffTime -> IO DiffTime addNoise t n = do r <- Random.randomIO :: IO Float return $ t + (Clock.secondsToDiffTime . round $ (r * (fromIntegral . toSeconds $ n))) - n / 2 where toSeconds dt = Clock.diffTimeToPicoseconds dt `div` 10^(12 :: Integer)