module IHP.Job.Queue.STM
( tryWriteTBQueue
) where

import IHP.Prelude
import Control.Concurrent.STM (TBQueue, writeTBQueue, STM)
import Control.Concurrent.STM.TBQueue (isFullTBQueue)

-- | Non-blocking write to a TBQueue. Returns True if the value was written,
-- False if the queue was full.
tryWriteTBQueue :: TBQueue a -> a -> STM Bool
tryWriteTBQueue :: forall a. TBQueue a -> a -> STM Bool
tryWriteTBQueue TBQueue a
queue a
value = do
    full <- TBQueue a -> STM Bool
forall a. TBQueue a -> STM Bool
isFullTBQueue TBQueue a
queue
    if full
        then pure False
        else do
            writeTBQueue queue value
            pure True