{-# LANGUAGE RecordWildCards #-}

module Network.QUIC.Stream.Queue where

import Data.ByteString (ByteString)
import Control.Concurrent.STM

import Network.QUIC.Stream.Types

putRecvStreamQ :: Stream -> ByteString -> IO ()
putRecvStreamQ :: Stream -> ByteString -> IO ()
putRecvStreamQ Stream{StreamId
TVar Flow
IORef (Skew RxStreamData)
IORef StreamState
IORef Flow
Connection
RecvStreamQ
streamReass :: Stream -> IORef (Skew RxStreamData)
streamRecvQ :: Stream -> RecvStreamQ
streamStateRx :: Stream -> IORef StreamState
streamStateTx :: Stream -> IORef StreamState
streamFlowRx :: Stream -> IORef Flow
streamFlowTx :: Stream -> TVar Flow
streamConnection :: Stream -> Connection
streamId :: Stream -> StreamId
streamReass :: IORef (Skew RxStreamData)
streamRecvQ :: RecvStreamQ
streamStateRx :: IORef StreamState
streamStateTx :: IORef StreamState
streamFlowRx :: IORef Flow
streamFlowTx :: TVar Flow
streamConnection :: Connection
streamId :: StreamId
..} = STM () -> IO ()
forall a. STM a -> IO 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
TVar Flow
IORef (Skew RxStreamData)
IORef StreamState
IORef Flow
Connection
RecvStreamQ
streamReass :: IORef (Skew RxStreamData)
streamRecvQ :: RecvStreamQ
streamStateRx :: IORef StreamState
streamStateTx :: IORef StreamState
streamFlowRx :: IORef Flow
streamFlowTx :: TVar Flow
streamConnection :: Connection
streamId :: StreamId
streamReass :: Stream -> IORef (Skew RxStreamData)
streamRecvQ :: Stream -> RecvStreamQ
streamStateRx :: Stream -> IORef StreamState
streamStateTx :: Stream -> IORef StreamState
streamFlowRx :: Stream -> IORef Flow
streamFlowTx :: Stream -> TVar Flow
streamConnection :: Stream -> Connection
streamId :: Stream -> StreamId
..} = STM ByteString -> IO ByteString
forall a. STM a -> IO 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
TVar Flow
IORef (Skew RxStreamData)
IORef StreamState
IORef Flow
Connection
RecvStreamQ
streamReass :: IORef (Skew RxStreamData)
streamRecvQ :: RecvStreamQ
streamStateRx :: IORef StreamState
streamStateTx :: IORef StreamState
streamFlowRx :: IORef Flow
streamFlowTx :: TVar Flow
streamConnection :: Connection
streamId :: StreamId
streamReass :: Stream -> IORef (Skew RxStreamData)
streamRecvQ :: Stream -> RecvStreamQ
streamStateRx :: Stream -> IORef StreamState
streamStateTx :: Stream -> IORef StreamState
streamFlowRx :: Stream -> IORef Flow
streamFlowTx :: Stream -> TVar Flow
streamConnection :: Stream -> Connection
streamId :: Stream -> StreamId
..} = STM (Maybe ByteString) -> IO (Maybe ByteString)
forall a. STM a -> IO 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