{-# language BangPatterns #-}
{-# language DataKinds #-}
module Socket.Stream.Interruptible.Addr
( send
, receiveExactly
, receiveOnce
, receiveBetween
) where
import Data.Bytes.Types (UnmanagedBytes(..))
import Data.Primitive.Addr (Addr)
import Control.Concurrent.STM (TVar)
import Socket.Stream (Connection,ReceiveException,SendException)
import Socket (Interruptibility(Interruptible))
import qualified Socket.Stream.Interruptible.Addr.Send as Send
import qualified Socket.Stream.Interruptible.Addr.Receive as Receive
send ::
TVar Bool
-> Connection
-> Addr
-> Int
-> IO (Either (SendException 'Interruptible) ())
{-# inline send #-}
send !tv !conn !addr !len = Send.send tv conn (UnmanagedBytes addr len)
receiveExactly ::
TVar Bool
-> Connection
-> Addr
-> Int
-> IO (Either (ReceiveException 'Interruptible) ())
{-# inline receiveExactly #-}
receiveExactly !tv !conn !addr !len =
Receive.receiveExactly tv conn (UnmanagedBytes addr len)
receiveOnce ::
TVar Bool
-> Connection
-> Addr
-> Int
-> IO (Either (ReceiveException 'Interruptible) Int)
{-# inline receiveOnce #-}
receiveOnce tv conn addr len =
Receive.receiveOnce tv conn (UnmanagedBytes addr len)
receiveBetween ::
TVar Bool
-> Connection
-> Addr
-> Int
-> Int
-> IO (Either (ReceiveException 'Interruptible) Int)
{-# inline receiveBetween #-}
receiveBetween tv conn addr minLen maxLen =
Receive.receiveBetween tv conn (UnmanagedBytes addr maxLen) minLen