{-# LANGUAGE RecordWildCards #-}

module Network.QUIC.Stream.Queue where

import Data.ByteString (ByteString)
import UnliftIO.STM

import Network.QUIC.Stream.Types

putRecvStreamQ :: Stream -> ByteString -> IO ()
putRecvStreamQ :: Stream -> ByteString -> IO ()
putRecvStreamQ Stream{StreamId
MVar ()
TVar TxFlow
IORef RxFlow
IORef (Skew RxStreamData)
IORef StreamState
Connection
RecvStreamQ
streamId :: StreamId
streamConnection :: Connection
streamFlowTx :: TVar TxFlow
streamFlowRx :: IORef RxFlow
streamStateTx :: IORef StreamState
streamStateRx :: IORef StreamState
streamRecvQ :: RecvStreamQ
streamReass :: IORef (Skew RxStreamData)
streamSyncFinTx :: MVar ()
streamId :: Stream -> StreamId
streamConnection :: Stream -> Connection
streamFlowTx :: Stream -> TVar TxFlow
streamFlowRx :: Stream -> IORef RxFlow
streamStateTx :: Stream -> IORef StreamState
streamStateRx :: Stream -> IORef StreamState
streamRecvQ :: Stream -> RecvStreamQ
streamReass :: Stream -> IORef (Skew RxStreamData)
streamSyncFinTx :: Stream -> MVar ()
..} = STM () -> IO ()
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM () -> IO ()) -> (ByteString -> STM ()) -> ByteString -> IO ()
forall b c a. (b -> c) -> (a -> b) -> a -> c
. TQueue ByteString -> ByteString -> STM ()
forall a. TQueue a -> a -> STM ()
writeTQueue (RecvStreamQ -> TQueue ByteString
recvStreamQ RecvStreamQ
streamRecvQ)

takeRecvStreamQ :: Stream -> IO ByteString
takeRecvStreamQ :: Stream -> IO ByteString
takeRecvStreamQ Stream{StreamId
MVar ()
TVar TxFlow
IORef RxFlow
IORef (Skew RxStreamData)
IORef StreamState
Connection
RecvStreamQ
streamId :: Stream -> StreamId
streamConnection :: Stream -> Connection
streamFlowTx :: Stream -> TVar TxFlow
streamFlowRx :: Stream -> IORef RxFlow
streamStateTx :: Stream -> IORef StreamState
streamStateRx :: Stream -> IORef StreamState
streamRecvQ :: Stream -> RecvStreamQ
streamReass :: Stream -> IORef (Skew RxStreamData)
streamSyncFinTx :: Stream -> MVar ()
streamId :: StreamId
streamConnection :: Connection
streamFlowTx :: TVar TxFlow
streamFlowRx :: IORef RxFlow
streamStateTx :: IORef StreamState
streamStateRx :: IORef StreamState
streamRecvQ :: RecvStreamQ
streamReass :: IORef (Skew RxStreamData)
streamSyncFinTx :: MVar ()
..} = STM ByteString -> IO ByteString
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM ByteString -> IO ByteString)
-> STM ByteString -> IO ByteString
forall a b. (a -> b) -> a -> b
$ TQueue ByteString -> STM ByteString
forall a. TQueue a -> STM a
readTQueue (TQueue ByteString -> STM ByteString)
-> TQueue ByteString -> STM ByteString
forall a b. (a -> b) -> a -> b
$ RecvStreamQ -> TQueue ByteString
recvStreamQ RecvStreamQ
streamRecvQ

tryTakeRecvStreamQ :: Stream -> IO (Maybe ByteString)
tryTakeRecvStreamQ :: Stream -> IO (Maybe ByteString)
tryTakeRecvStreamQ Stream{StreamId
MVar ()
TVar TxFlow
IORef RxFlow
IORef (Skew RxStreamData)
IORef StreamState
Connection
RecvStreamQ
streamId :: Stream -> StreamId
streamConnection :: Stream -> Connection
streamFlowTx :: Stream -> TVar TxFlow
streamFlowRx :: Stream -> IORef RxFlow
streamStateTx :: Stream -> IORef StreamState
streamStateRx :: Stream -> IORef StreamState
streamRecvQ :: Stream -> RecvStreamQ
streamReass :: Stream -> IORef (Skew RxStreamData)
streamSyncFinTx :: Stream -> MVar ()
streamId :: StreamId
streamConnection :: Connection
streamFlowTx :: TVar TxFlow
streamFlowRx :: IORef RxFlow
streamStateTx :: IORef StreamState
streamStateRx :: IORef StreamState
streamRecvQ :: RecvStreamQ
streamReass :: IORef (Skew RxStreamData)
streamSyncFinTx :: MVar ()
..} = STM (Maybe ByteString) -> IO (Maybe ByteString)
forall (m :: * -> *) a. MonadIO m => STM a -> m a
atomically (STM (Maybe ByteString) -> IO (Maybe ByteString))
-> STM (Maybe ByteString) -> IO (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ TQueue ByteString -> STM (Maybe ByteString)
forall a. TQueue a -> STM (Maybe a)
tryReadTQueue (TQueue ByteString -> STM (Maybe ByteString))
-> TQueue ByteString -> STM (Maybe ByteString)
forall a b. (a -> b) -> a -> b
$ RecvStreamQ -> TQueue ByteString
recvStreamQ RecvStreamQ
streamRecvQ