Loading...
module Main (main) where

import Data.Function ((&))
import Data.Word (Word8)
import Network.Socket (PortNumber)
import Streamly.Data.Stream.Prelude (Stream)

import qualified Streamly.Console.Stdio as Stdio
import qualified Streamly.Data.Array as Array
import qualified Streamly.Data.Fold as Fold
import qualified Streamly.Data.Stream.Prelude as Stream
import qualified Streamly.Internal.Network.Inet.TCP as TCP
import qualified Streamly.Unicode.Stream as Unicode


remoteAddr :: (Word8,Word8,Word8,Word8)
remoteAddr = (127, 0, 0, 1)

remotePort :: PortNumber
remotePort = 8091

echo :: Stream IO ()
echo =
      Stream.unfold Stdio.reader ()                -- Stream IO Word8
    & split (== 10) Array.create                   -- Stream IO (Array Word8)
    & TCP.pipeChunks remoteAddr remotePort         -- Stream IO (Array Word8)
    & Stream.unfoldEach Array.reader               -- Stream IO Word8
    & Unicode.decodeLatin1                         -- Stream IO Char
    & Stream.mapM putChar                          -- Stream IO ()

    where

    split p f = Stream.foldMany (Fold.takeEndBy p f)

main :: IO ()
main = Stream.fold Fold.drain echo