{-# language BangPatterns #-}
{-# language LambdaCase #-}
{-# language GADTSyntax #-}
{-# language KindSignatures #-}
{-# language DataKinds #-}
{-# language MagicHash #-}
module Socket.Datagram.Uninterruptible.MutableBytes
(
send
, sendToIPv4
, receive
, receiveFromIPv4
, MM.receiveMany
, MM.receiveManyFromIPv4
, PeerlessSlab(..)
, IPv4Slab(..)
, newPeerlessSlab
, newIPv4Slab
) where
import Data.Bytes.Types (MutableBytes)
import Data.Primitive.PrimArray.Offset (MutablePrimArrayOffset)
import GHC.Exts (RealWorld,proxy#)
import Posix.Socket (SocketAddressInternet)
import Socket (Connectedness(..),Family(..),Version(..),Interruptibility(Uninterruptible))
import Socket.Datagram (Socket(..),SendException,ReceiveException)
import Socket.IPv4 (Peer,newIPv4Slab,IPv4Slab(..))
import Socket.Discard (PeerlessSlab(..),newPeerlessSlab)
import qualified Socket.Datagram.Uninterruptible.MutableBytes.Many as MM
import qualified Socket.Datagram.Uninterruptible.MutableBytes.Receive.Connected as CR
import qualified Socket.Datagram.Uninterruptible.MutableBytes.Send.Connected as CS
import qualified Socket.Datagram.Uninterruptible.MutableBytes.Send.IPv4 as V4S
import qualified Socket.Datagram.Uninterruptible.MutableBytes.Receive.IPv4 as V4R
send ::
Socket 'Connected a
-> MutableBytes RealWorld
-> IO (Either (SendException 'Uninterruptible) ())
send (Socket !sock) !buf =
CS.send proxy# () sock buf
receive ::
Socket c a
-> MutableBytes RealWorld
-> IO (Either (ReceiveException 'Uninterruptible) Int)
receive (Socket !sock) !buf =
CR.receive proxy# sock buf () >>= \case
Right sz -> pure (Right sz)
Left err -> pure (Left err)
sendToIPv4 ::
Socket 'Unconnected ('Internet 'V4)
-> Peer
-> MutableBytes RealWorld
-> IO (Either (SendException 'Uninterruptible) ())
sendToIPv4 (Socket !sock) !dst !buf =
V4S.send proxy# dst sock buf
receiveFromIPv4 ::
Socket 'Unconnected ('Internet 'V4)
-> MutableBytes RealWorld
-> MutablePrimArrayOffset RealWorld SocketAddressInternet
-> IO (Either (ReceiveException 'Uninterruptible) Int)
receiveFromIPv4 (Socket !sock) !buf !addr =
V4R.receive proxy# sock buf addr