{-# LANGUAGE UnicodeSyntax #-}
{-# LANGUAGE FlexibleContexts #-}

-- | Lifted 'TBQueue' operations.
module Control.Concurrent.STM.TBQueue.Lifted
  ( TBQueue
  , newTBQueue
  , newTBQueueIO
  , readTBQueue
  , tryReadTBQueue
  , peekTBQueue
  , tryPeekTBQueue
  , flushTBQueue
  , writeTBQueue
  , unGetTBQueue
  , isEmptyTBQueue
  , isFullTBQueue
  ) where

import Numeric.Natural (Natural)
import Control.Monad.Base (MonadBase(..))
import Control.Monad.STM (STM)
import Control.Concurrent.STM.TBQueue (TBQueue)
import qualified Control.Concurrent.STM.TBQueue as STM

-- | A lifted version of 'STM.newTBQueue'.
newTBQueue  MonadBase STM μ  Natural  μ (TBQueue α)
newTBQueue = liftBase . STM.newTBQueue
{-# INLINE newTBQueue #-}

-- | A lifted version of 'STM.newTBQueueIO'.
newTBQueueIO  MonadBase IO μ  Natural  μ (TBQueue α)
newTBQueueIO = liftBase . STM.newTBQueueIO
{-# INLINE newTBQueueIO #-}

-- | A lifted version of 'STM.readTBQueue'.
readTBQueue  MonadBase STM μ  TBQueue α  μ α
readTBQueue = liftBase . STM.readTBQueue
{-# INLINE readTBQueue #-}

-- | A lifted version of 'STM.tryReadTBQueue'.
tryReadTBQueue  MonadBase STM μ  TBQueue α  μ (Maybe α)
tryReadTBQueue = liftBase . STM.tryReadTBQueue
{-# INLINE tryReadTBQueue #-}

-- | A lifted version of 'STM.peekTBQueue'.
peekTBQueue  MonadBase STM μ  TBQueue α  μ α
peekTBQueue = liftBase . STM.peekTBQueue
{-# INLINE peekTBQueue #-}

-- | A lifted version of 'STM.tryPeekTBQueue'.
tryPeekTBQueue  MonadBase STM μ  TBQueue α  μ (Maybe α)
tryPeekTBQueue = liftBase . STM.tryPeekTBQueue
{-# INLINE tryPeekTBQueue #-}

-- | A lifted version of 'STM.flushTBQueue'.
flushTBQueue  MonadBase STM μ  TBQueue α  μ [α]
flushTBQueue = liftBase . STM.flushTBQueue
{-# INLINE flushTBQueue #-}

-- | A lifted version of 'STM.writeTBQueue'.
writeTBQueue  MonadBase STM μ  TBQueue α  α  μ ()
writeTBQueue = (liftBase .) . STM.writeTBQueue
{-# INLINE writeTBQueue #-}

-- | A lifted version of 'STM.unGetTBQueue'.
unGetTBQueue  MonadBase STM μ  TBQueue α  α  μ ()
unGetTBQueue = (liftBase .) . STM.unGetTBQueue
{-# INLINE unGetTBQueue #-}

-- | A lifted version of 'STM.isEmptyTBQueue'.
isEmptyTBQueue  MonadBase STM μ  TBQueue α  μ Bool
isEmptyTBQueue = liftBase . STM.isEmptyTBQueue
{-# INLINE isEmptyTBQueue #-}

-- | A lifted version of 'STM.isFullTBQueue'.
isFullTBQueue  MonadBase STM μ  TBQueue α  μ Bool
isFullTBQueue = liftBase . STM.isFullTBQueue
{-# INLINE isFullTBQueue #-}