-- A concurrent TCP server that echoes everything that it receives. import Control.Monad.Catch (finally) import Data.Function ((&)) import Network.Socket (Socket) import qualified Network.Socket as Net import qualified Streamly.Network.Inet.TCP as TCP import qualified Streamly.Network.Socket as Socket import qualified Streamly.Prelude as Stream main :: IO () main = Stream.unfold TCP.acceptOnPort 8091 -- ParallelT IO Socket & Stream.mapM (handleWithM echo) -- ParallelT IO () & Stream.fromParallel -- SerialT IO () & Stream.drain -- IO () where echo :: Socket -> IO () echo sk = Stream.unfold Socket.readChunksWithBufferOf (32768, sk) -- SerialT IO (Array Word8) & Stream.fold (Socket.writeChunks sk) -- IO () handleWithM :: (Socket -> IO ()) -> Socket -> IO () handleWithM f sk = finally (f sk) (Net.close sk)