Loading...
-- 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.Data.Fold as Fold
import qualified Streamly.Data.Stream.Prelude as Stream
import qualified Streamly.Network.Inet.TCP as TCP
import qualified Streamly.Network.Socket as Socket

main :: IO ()
main =
      Stream.unfold TCP.acceptorOnPort 8091 -- Stream IO Socket
    & Stream.parMapM id (handleWithM echo)  -- Stream IO ()
    & Stream.fold Fold.drain                -- IO ()

    where

    echo :: Socket -> IO ()
    echo sk =
          Stream.unfold Socket.chunkReaderWith (32768, sk) -- Stream IO (Array Word8)
        & Stream.fold (Socket.writeChunks sk)              -- IO ()

    handleWithM :: (Socket -> IO ()) -> Socket -> IO ()
    handleWithM f sk = finally (f sk) (Net.close sk)