module SocketsAndPipes.Serve.Loop ( run ) where
import SocketsAndPipes.Serve.ForkBracket
( forkBracket, Cleanup (..), ThreadId )
import SocketsAndPipes.Serve.Sockets
( PeerSocket, PassiveSocket, accept,
closePeerSocketPolitely, closePeerSocketAbruptly )
import Control.Monad ( forever )
run ::
(PeerSocket -> IO a)
-> PassiveSocket
-> IO b
run :: (PeerSocket -> IO a) -> PassiveSocket -> IO b
run PeerSocket -> IO a
server PassiveSocket
s = IO ThreadId -> IO b
forall (f :: * -> *) a b. Applicative f => f a -> f b
forever (PassiveSocket -> (PeerSocket -> IO a) -> IO ThreadId
forall a. PassiveSocket -> (PeerSocket -> IO a) -> IO ThreadId
acceptAndFork PassiveSocket
s PeerSocket -> IO a
server)
acceptAndFork ::
PassiveSocket
-> (PeerSocket -> IO a)
-> IO ThreadId
acceptAndFork :: PassiveSocket -> (PeerSocket -> IO a) -> IO ThreadId
acceptAndFork PassiveSocket
s = IO PeerSocket
-> Cleanup PeerSocket -> (PeerSocket -> IO a) -> IO ThreadId
forall resource x.
IO resource
-> Cleanup resource -> (resource -> IO x) -> IO ThreadId
forkBracket (PassiveSocket -> IO PeerSocket
accept PassiveSocket
s) Cleanup PeerSocket
socketForkBracketCleanup
socketForkBracketCleanup :: Cleanup PeerSocket
socketForkBracketCleanup :: Cleanup PeerSocket
socketForkBracketCleanup = Cleanup :: forall resource x y.
(resource -> IO x) -> (resource -> IO y) -> Cleanup resource
Cleanup{PeerSocket -> IO ()
onForkFail :: PeerSocket -> IO ()
onForkFail :: PeerSocket -> IO ()
onForkFail, PeerSocket -> IO ()
onThreadEnd :: PeerSocket -> IO ()
onThreadEnd :: PeerSocket -> IO ()
onThreadEnd}
where
onThreadEnd :: PeerSocket -> IO ()
onThreadEnd =
PeerSocket -> IO ()
closePeerSocketPolitely
onForkFail :: PeerSocket -> IO ()
onForkFail =
PeerSocket -> IO ()
closePeerSocketAbruptly