@@ -32,8 +32,9 @@
33module Streamly.Network.Socket
33module Streamly.Network.Socket
35 -- * Read from connection
36 -- * Read from connection
36− fromSocket
37+ , fromSocket
38 -- , readUtf8
39 -- , readUtf8
39 -- , readLines
40 -- , readLines
@@ -64,7 +65,7 @@ module Streamly.Network.Socket
66import Control.Concurrent (threadWaitWrite, rtsSupportsBoundThreads)
67import Control.Concurrent (threadWaitWrite, rtsSupportsBoundThreads)
67−import Control.Monad.Catch (MonadCatch)
68+import Control.Monad.Catch (MonadCatch, onException)
68import Control.Monad.IO.Class (MonadIO(..))
69import Control.Monad.IO.Class (MonadIO(..))
69import Control.Monad (when)
70import Control.Monad (when)
70import Data.Word (Word8)
71import Data.Word (Word8)
@@ -93,6 +94,16 @@ import qualified Streamly.Mem.Array as A
93import qualified Streamly.Mem.Array.Types as A hiding (flattenArrays)
94import qualified Streamly.Mem.Array.Types as A hiding (flattenArrays)
94import qualified Streamly.Prelude as S
95import qualified Streamly.Prelude as S
97+-- | @'withSocket' socket act@ runs the computation @act@ passing the socket
98+-- handle to it. The handle will be closed on exit from 'withSocket', whether
99+-- by normal termination or by raising an exception. If closing the handle
100+-- raises an exception, then this exception will be raised by 'withSocket'
101+-- rather than any exception raised by 'act'.
102+withSocket :: (MonadCatch m, MonadIO m) => Socket -> (Socket -> m ()) -> m ()
104+ f sk `onException` liftIO (Net.close sk)
105+ liftIO (Net.close sk)
96-------------------------------------------------------------------------------
107-------------------------------------------------------------------------------
97-- Array IO (Input)
108-- Array IO (Input)
98-------------------------------------------------------------------------------
109-------------------------------------------------------------------------------