module Network.ADB.Socket where
import Control.Exception
import Control.Monad.Error
import Network.ADB.Transport
import Network.Socket (Socket, sClose)
import Network.Socket.ByteString
import System.IO.Error
import Prelude hiding (read)
socketTransport :: Socket -> Transport (ErrorT TransportError IO)
socketTransport s = Transport {
write = \bs -> do
ee <- liftIO . try $ sendAll s bs
case ee of
Left (exc :: IOError) -> throwError ClosedByPeer
Right () -> return (),
read = \n -> do
ee <- liftIO . try $ recv s n
case ee of
Left (exc :: IOError) -> throwError ClosedByPeer
Right blk -> do
return blk,
close = do
ee <- liftIO . try $ sClose s
case ee of
Left (exc :: IOError) -> throwError ClosedByPeer
Right blk -> return blk
}