module Network.QUIC.Types.Queue where

import Control.Concurrent.STM

import Network.QUIC.Types.Packet

newtype RecvQ = RecvQ (TQueue ReceivedPacket)

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

readRecvQ :: RecvQ -> IO ReceivedPacket
readRecvQ :: RecvQ -> IO ReceivedPacket
readRecvQ (RecvQ TQueue ReceivedPacket
q) = STM ReceivedPacket -> IO ReceivedPacket
forall a. STM a -> IO a
atomically (STM ReceivedPacket -> IO ReceivedPacket)
-> STM ReceivedPacket -> IO ReceivedPacket
forall a b. (a -> b) -> a -> b
$ TQueue ReceivedPacket -> STM ReceivedPacket
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 = STM () -> IO ()
forall a. STM a -> IO a
atomically (STM () -> IO ()) -> STM () -> IO ()
forall a b. (a -> b) -> a -> b
$ TQueue ReceivedPacket -> ReceivedPacket -> STM ()
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) = TQueue ReceivedPacket -> ReceivedPacket -> STM ()
forall a. TQueue a -> a -> STM ()
unGetTQueue TQueue ReceivedPacket
q