module SocketInterruptibleChannel
( M
, SendException
, ReceiveException
, showsPrecSendException
, showsPrecReceiveException
, Resource(..)
, send
, receive
) where
import Data.Bytes (Bytes)
import Data.Bytes.Chunks (Chunks)
import Network.Socket (Socket)
import Foreign.C.Error (Errno)
import Control.Concurrent.STM (TVar)
import qualified Foreign.C.Error.Describe as Describe
import qualified Network.Unexceptional.Bytes as NB
import qualified Network.Unexceptional.Chunks as NC
type M = IO
data Resource = Resource {-# UNPACK #-} !Socket !(TVar Bool)
type ReceiveException = Errno
type SendException = Errno
showsPrecSendException :: Int -> SendException -> String -> String
showsPrecSendException = showsPrecErrno
showsPrecReceiveException :: Int -> ReceiveException -> String -> String
showsPrecReceiveException = showsPrecErrno
showsPrecErrno :: Int -> Errno -> String -> String
showsPrecErrno _ e s = Describe.string e ++ (' ' : s)
send ::
Resource
-> Chunks
-> M (Either Errno ())
send (Resource a interrupt) b = do
NC.sendInterruptible interrupt a b
receive ::
Resource
-> M (Either Errno Bytes)
receive (Resource a interrupt) = NB.receiveInterruptible interrupt a 12000