module Network.QUIC.Types.Queue where

import UnliftIO.STM

import Network.QUIC.Types.Packet

newtype RecvQ = RecvQ (TQueue ReceivedPacket)

newRecvQ :: IO RecvQ
newRecvQ :: IO RecvQ
newRecvQ = TQueue ReceivedPacket -> RecvQ
RecvQ forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> forall (m :: * -> *) a. MonadIO m => m (TQueue a)
newTQueueIO

readRecvQ :: RecvQ -> IO ReceivedPacket
readRecvQ :: RecvQ -> IO ReceivedPacket
readRecvQ (RecvQ TQueue ReceivedPacket
q) = forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TQueue a -> STM a
readTQueue TQueue ReceivedPacket
q

writeRecvQ :: RecvQ -> ReceivedPacket -> IO ()
writeRecvQ :: RecvQ -> ReceivedPacket -> IO ()
writeRecvQ (RecvQ TQueue ReceivedPacket
q) ReceivedPacket
x = forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically forall a b. (a -> b) -> a -> b
$ forall a. TQueue a -> a -> STM ()
writeTQueue TQueue ReceivedPacket
q ReceivedPacket
x

prependRecvQ :: RecvQ -> ReceivedPacket -> STM ()
prependRecvQ :: RecvQ -> ReceivedPacket -> STM ()
prependRecvQ (RecvQ TQueue ReceivedPacket
q) = forall a. TQueue a -> a -> STM ()
unGetTQueue TQueue ReceivedPacket
q