packages feed

polysemy-conc-0.3.0.0: lib/Polysemy/Conc/Queue/Timeout.hs

-- |Description: Timeout Helper
module Polysemy.Conc.Queue.Timeout where

import Polysemy.Time (TimeUnit)

import qualified Polysemy.Conc.Data.QueueResult as QueueResult
import Polysemy.Conc.Data.QueueResult (QueueResult)
import Polysemy.Conc.Effect.Race (Race)
import qualified Polysemy.Conc.Race as Race

-- |Run an 'STM' action atomically with a time limit
withTimeout ::
  TimeUnit t =>
  Members [Race, Embed IO] r =>
  t ->
  STM (Maybe d) ->
  Sem r (QueueResult d)
withTimeout timeout readQ =
  Race.timeoutAs_ QueueResult.NotAvailable timeout reader'
  where
    reader' =
      maybe QueueResult.Closed QueueResult.Success <$> atomically readQ