module Session.Timing.Math
( nextExpires
, isExpired
) where
import Internal.Prelude
import Session.Timing.Time
import Session.Timing.Timeout
import Time
-- | Calculate the next point in time where the given session
-- will expire assuming that it sees no activity until then
--
-- Returns 'Nothing' if and only if the settings do not specify any timeout
-- limits.
nextExpires
:: Timeout NominalDiffTime
-> Time UTCTime
-- ^ A session's timing information
-> Maybe UTCTime
nextExpires timeout time =
(fmap minimum . nonEmpty . catMaybes)
[ flip addUTCTime time.accessed <$> timeout.idle
, flip addUTCTime time.created <$> timeout.absolute
]
-- | Check if a session has expired
isExpired
:: Timeout NominalDiffTime
-- ^ Settings
-> UTCTime
-- ^ Now
-> Time UTCTime
-- ^ A session's timing information
-> Bool
isExpired timeout now time =
maybe False (<= now) $ nextExpires timeout time