module Data.Time.Since (TimeSince, newTimeSince, timeSince) where import Data.IORef (IORef, newIORef, writeIORef, readIORef) import Data.Time.Clock (UTCTime, NominalDiffTime, getCurrentTime, diffUTCTime) newtype TimeSince = TimeSince { sinceRef :: IORef UTCTime } newTimeSince :: IO TimeSince newTimeSince = do n <- getCurrentTime TimeSince <$> newIORef n timeSince :: TimeSince -> IO NominalDiffTime timeSince TimeSince{sinceRef = sinceRef} = do n <- readIORef sinceRef m <- getCurrentTime writeIORef sinceRef m pure (diffUTCTime m n)