packages feed

ki-0.1.0: src/Ki/Timeout.hs

module Ki.Timeout
  ( timeoutSTM,
  )
where

import Ki.Duration (Duration)
import qualified Ki.Duration as Duration
import Ki.Prelude

-- | Wait for an @STM@ action to return an @IO@ action, or if the given duration elapses, return the given @IO@ action
-- instead.
timeoutSTM :: Duration -> STM (IO a) -> IO a -> IO a
timeoutSTM duration action fallback = do
  (delay, unregister) <- registerDelay (Duration.toMicroseconds duration)
  atomicallyIO (delay $> fallback <|> (unregister >>) <$> action)